9.อินพุต เอาต์พุต พื้นฐาน คำสั่ง cout คำสั่ง cin


การรับค่าจากแป้นพิมพ์ด้วย cin และแสดงผลลัพธ์ทางจอภาพด้วย cout
สอนการใช้งาน cin เพื่อรับค่าตัวเลขจากแป้นพิมพ์ การแสดงผลทางจอภาพด้วย cout การ run โปรแกรมที่เขียนด้วย C++ ผ่านทาง command prompt





การรับค่าทางแป้นพิมพ์ด้วย getline() เพื่อรับค่าสตริงที่มีช่องว่าง




เข้าใจการทำงานของ cin และ getline เพื่อรับค่าจากแป้นพิมพ์ โดยแสดงให้เห็นถึง 1) การรับค่าเพียงค่าเดียว 2) การรับค่าพร้อม ๆ กันหลาย ๆ ค่า โดยแต่ละค่าจะถูกคั่นด้วยช่องว่าง 3) การรับค่าตัวอักษรที่มีช่องว่างระหว่างกลาง เช่น ต้องการรับค่าชื่อหนัง "toy story" โดยใช้ getline

ตัวอย่างโปรแกรมจากคลิปวิดีโอ

#include <iostream>
using namespace std;

void demo1() {
    cout << "enter your favorite movie: ";
    string movie;
    cin >> movie;
    cout << movie << endl;
}

void demo2() {
    cout << "enter your favorite movie: ";
    string movie;
    getline(cin, movie);
    cout << movie << endl;
}

void demo3() {
    string name;
    double w, h;
    cout << "enter name weight height -> ";
    cin >> name >> w >> h;
    cout << "name = " << name << endl;
    cout << "w = " << w << endl;
    cout << "h = " << h << endl;
}

void demo4() {
    string fname, lname;
    cout << "enter first and last name: ";
    cin >> fname >> lname;
    cout << "fname = " << fname << " lname = " << lname;
}
int main() {
//    demo1();
//    demo2();
//    demo3();
    demo4();
    return 0;
}

อินพุต เอาต์พุต พื้นฐาน
สิ่งที่สำคัญที่สุดในการเขียนโปรแกรมคือ Input และ Output ของโปรแกรม เพราะว่าทุกๆ โปรแกรมจำเป็นต้องติดต่อกับผู้ใช้ ในภาษา C++ จะใช้ Stream เพื่อดำเนินการกับ Input และ Output ของโปรแกรม ซึ่ง Stream นั้นเป็นไลบรารี่มาตรฐานของภาษา C++ เราใช้ cin stream สำหรับการ Input และ cout stream สำหรับ Output และเพื่อใช้โดยไม่ต้องมี std prefix เราจำเป็นต้องใช้คำสั่งนี้ในโปรแกรมของเรา
using namespace std;       

ในบทนี้ เราจะพูดถึงเพียงแค่การ Input และ Output แบบพื้นฐานเท่านั้น ซึ่งจะเป็นการรับค่าและการแสดงผล ในการรับค่านั้นจะเป็นการรับค่าจากทางคีย์บอร์ด และการแสดงผลจะเป็นการแสดงผลใน Console ที่หน้าจอของคอมพิวเตอร์
Standard output
โดยทั่วไป การแสดงผลมักจะถูกแสดงผลออกทางหน้าจอของคอมพิวเตอร์ cout เป็น Stream object ที่เราสามารถแสดงผลตัวอักษรใดๆ ออกทางจอภาพได้ นี่เป็นตัวอย่างของโปรแกรมที่มีการแสดงผลลัพธ์ออกมา
#include <iostream>
using namespace std;

int main()
{
    int myNumber = 5;
    cout << "This is my sentence." << endl;
    cout << 1234 << endl;
    cout << myNumber << endl;
    return 0;
}
จากตัวอย่าง เราได้แสดงตัวอักษรออกทางจอภาพในบรรทัดแรก ต่อมาเป็นตัวเลข และสุดท้ายเราได้แสดงค่าของตัวแปร myNumber ดังนั้น เราสามารถใช้คำสั่ง cout เพื่อแสดงผลตัวอักษร ตัวแปรหรือสิ่งต่างๆ ออกทางจอภาพได้ ในการใช้งานคำสั่ง cout จะตามด้วยเครื่องหมายน้อยกว่าสองอัน << และตามด้วยข้อความที่จะแสดง คุณสามารถใส่ได้หลายพารามิเตอร์โดยการคั่นด้วยเครื่องหมายดังกล่าวไปเรื่อยๆ และข้างล่างนี้เป็นผลลัพธ์ของโปรแกรม
This is my sentence.
1234
5
ในโปรแกรม คุณได้เห็นโค้ดบางส่วนจากในบทก่อนหน้าแล้ว เช่น endl มันเป็นค่าคงที่จากไลบรารี่มาตรฐาน std ซึ่งหมายถึงการขึ้นบรรทัดใหม่ ซึ่งเหมือนกับการใช้ \n เพื่อขึ้นบรรทัดใหม่โดยตรง
Standard input
แค่การแสดงผลนั้นยังไม่เพียงพอ ในภาษา C++ ยังมี cin stream object ซึ่งทำให้เราสามารถที่จะรับค่าจากคีย์บอร์ดได้ เรามักจะใช้คำสั่ง cin กับตัวแปร มาดูตัวอย่างการใช้
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int age;
    string name;
    cout << "What is your name: ";
    cin >> name;    // get name from keyboard
    cout << "Enter you age: ";
    cin >> age;    // get age from keyboard
    cout << "Hi " << name ;
    cout << ", your age is " << age ;
    return 0;
}
หลังจากโปรแกรมรัน Input อันแรกคือ cin >> name มันจะรอรับค่าจากคีย์บอร์ดจนกว่าเราจะกดปุ่ม Enter และนี่หมายถึงการรับค่าเสร็จสิ้น และข้อมูลจะถูกบันทึกลงในตัวแปร name สำหรับ Input อันที่สองโปรแกรมที่จะทำแบบเดียวกัน แต่มันจะบันทึกข้อมูลลองในตัวแปร age แทน ในการรับค่าคุณจะสังเกตุได้ว่าเราใช้เครื่องหมายมากกว่าสองอันแทน >>
ข้างล่างนี้เป็นผลลัพธ์ของโปรแกรม
What is your name: Marcus
Enter you age: 18
Hi Marcus, your age is 18.
คุณยังสามารถกดปุ่ม Space ได้สำหรับการรับค่าถัดไป ใน cin steam object การรับค่าจะจบเมื่อมันพบกับ Enter key (Carriage return) หรือ Space key เพื่อเป็นการสิ้นสุดการรับค่าจาก Keyboard stream ต่อไปมาดูตัวอย่างของโปรแกรมหาค่าที่มากที่สุดจากตัวเลขสามตัวที่รับค่าจากคีย์บอร์ด
#include <iostream>

using namespace std;

int main()
{
    int a, b, c;

    cout << "Enter value of a, b, c: ";
    cin >> a >> b >> c;

    if (a > b && a > c)
    {
        cout << "a is the greatest." << endl;
    }
    else if (b > c)
    {
        cout << "b is the greatest." << endl;
    }
    else
    {
        cout << "c is the greatest." << endl;
    }
    return 0;
}
เพื่อให้คุณเข้าใจในการรับค่าในภาษา C++ มากขึ้น นี่เป็นตัวอย่างของโปรแกรมในการรับค่าของตัวเลขจำนวนสามตัวทางคีย์บอร์ด คำสั่ง cin สามารถรับค่าได้ในครั้งเดียวโดยการคั่นด้วยเครื่องหมาย >> ไปเรื่อยๆ ในตัวอย่างเราได้รับค่าตัวแปร a b และ c ในคำสั่งเดียวกัน
Enter value of a, b, c: 2
5
3
b is the greatest.
Enter value of a, b, c: 2 5 3
b is the greatest.
นี่เป็นผลลัพธ์การทำงานของโปรแกรม คุณจะเห็นว่าเราได้รันโปรแกรมสองครั้งแต่ละครั้งจะรับค่าตัวเลขจำนวนสามตัว ในการรับค่าในภาษา C++ นั้นเราสามารถใช้ Whitespace หรือ Enter ในการสิ้นสุดการรับค่าแต่ละค่าได้ ซึ่งได้ผลลัพธ์เหมือนกัน
การรับค่าทั้งบรรทัดด้วยฟังก์ชัน getline()
ในตัวอย่างก่อนหน้า แสดงให้คุณเห็นว่าเราสามารถใช้ Whitespace ในการสิ้นสุดการรับค่าของแต่ละตัวแปร อย่างไรก็ตามคำสั่ง cin ยังให้เราสามารถรับค่า Space key ได้โดยการใช้ฟังก์ชัน getline() ซึ่งมากับไลบรารี่ของ String นี่เป็นตัวอย่าง มาดูตัวอย่างของโปรแกรม
#include <iostream>

using namespace std;

int main()
{
    string text;
    cout << "Enter message: ";
    getline(cin, text);
    cout << "You >> " << text;
    return 0;
}
ในตัวอย่าง เป็นการรับค่าข้อความทั้งบรรทัดและนำมาใส่ตัวแปร string text ฟังก์ชันนี้ให้เราสามารถรับค่าของ Space key ได้ เช่น ประโยค หรือคำหลายคำที่คั่นด้วยช่องว่าง โดยค่าของ Space จะเป็นเหมือนตัวอักษรว่างปล่าวตัวหนึ่งเหมือนกับตัวอักษรตัวอื่นๆ ดังนั้นเราจึงต้องกด Enter สำหรับการจบการรับค่าเท่านั้น พารามิเตอร์ของฟังก์ชันนั้นมีสองตัวคือ ตัวแรกจะเป็น cin steam object และตัวที่สองเป็นตัวแปรที่เราต้องการเก็บค่าไว้
Type something: I'm learning C++ on marcuscode.com.
You: I'm learning C++ on marcuscode.com.
นี่เป็นผลลัพธ์การทำงานของโปรแกรมสำหรับการรับค่าทั้งบรรทัดในภาษา C++
Escape characters
ตัวอักษรที่ขึ้นต้นด้วยเครื่องหมาย Slash (\) และตามด้วยตัวอักษรหนึ่งตัวนั้นเรียกว่า Escape characters มันเป็นตัวอักษรที่ใช้ในการแสดงการขึ้นบรรทัดใหม่ เครื่องหมาย Quote หรือตัวอักษรที่สำคัญอื่นๆ ที่ไม่สามารถแสดงได้ในแบบปกติ หรือว่าถูกใช้ในการกำหนดไวยากรณ์ของภาษา เช่น เครื่องหมาย " จะใช้กับ String literal ดังนั้น ในการใช้ตัวอักษรเหล่านี้คุณจำเป็นต้องทำการ Escape มันด้วยเครื่องหมาย \ เสมอ
นี่เป็นรายการของ Escape characters ในภาษา C++
Escape character
Represents
\a
Bell (alert)
\b
Backspace
\f
Formfeed
\n
New line
\r
Carriage return
\t
Horizontal tab
\v
Vertical tab
\'
Single quotation mark
\"
Double quotation mark
\\
Backslash
\?
Literal question mark
\ ooo
ASCII character in octal notation
\x hh
ASCII character in hexadecimal notation
\x hhhh
Unicode character in hexadecimal notation.
ต่อไปมาดูตัวอย่างการใช้งาน Escape character ในภาษา C++ ซึ่งเป็นโปรแกรมเกี่ยวกับการแสดงผล
#include <iostream>

using namespace std;

int main()
{

    cout << "\"The most popular language in 2016\".\n";
    cout << "#\tLanguage\tYear\n";
    cout << "1\tC\t1972\n";
    cout << "2\tJava\t1995\n";
    cout << "3\tPython\t1991\n";
    cout << "4\tC++\t1983\n";
    cout << "5\tR\t1993\n";

    return 0;
}
ในตัวอย่าง เป็นการใช้งาน Escape character สำหรับแสดงตัวอักษรต่างๆ เราได้แสดงตัวอักษร Quote ด้วย \" แสดง Tab ด้วย \t และการขึ้นบรรทัดใหม่ด้วย \n
"The most popular language in 2016".
#       Language        Year
1       C       1972
2       Java    1995
3       Python  1991
4       C++     1983
5       R       1993
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
ในบทนี้ เราได้ครอบคุมพื้นฐานของการรับค่าและการแสดงผลในภาษา C++ เราได้พูดถึงการแสดงผลโดยการใช้ cout steam object และการรับค่าด้วย cin steam object ซึ่งเป็นสิ่งที่สำคัญในการเขียนโปรแกรมที่มีการติดต่อกับผู้ใช้เพื่อรับข้อมูลและแสดงผล และเรายังให้คุณทราบถึงวิธีการรับค่า String ทีละบรรทัดโดยการใช้ฟังก์ชัน getline() และ Escape characters

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
การนำค่าข้อมูลในตัวแปร มาแสดงผลด้วยคำสั่ง cout
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

ของการสอนภาษา C++ กับ TUTORTONG ครับ ในบทนี้ก็จะมาว่ากันด้วยเรื่องพื้นฐานอีกเรื่องนั่นก็คือ การแสดงผลค่าข้อมูลในตัวแปร ด้วยคำสั่ง cout ครับ ถ้าถามว่า " ทำไมต้องแสดงผลค่าในตัวแปร " งั้นลองถามตัวเองกลับไปว่า ถ้าเราต้องบวกเลขสักสองตัวเช่น 1 + 1 เราต้องการ รู้ผลลัพธ์รึเปล่าครับ ? ถ้าใช่ นั่นคือคำตอบครับของ  " ทำไมต้องแสดงผลค่าในตัวแปร " นั่นเองครับ ^^

การแสดงผลค่าในตัวแปรด้วย คำสั่ง COUT
การแสดงผลค่าในตัวแปร คือ การเขียน Source Code เพื่อให้มีการแสดงค่าที่ถูกเก็บอยู่ในตัวแปรบนหน้าจอ Output เพราะฉะนั้นถ้าต้องการจะแสดงค่าในตัวแปรตัวไหนลงบนหน้าจอ ก็ให้ใช้วิธีนี้ได้เลยครับ
รูปแบบการแสดงผลค่าในตัวแปร
cout << ชื่อตัวแปร;
cout << variable;
ตัวอย่างการใช้
cout << x;
cout << number; 

ลองเขียน Source Code การแสดงผลค่าในตัวแปรด้วย คำสั่ง cout
ขั้นที่ 1)
ทำการสร้าง Source File ใหม่ใน Dev_C++ จากนั้น ทำการ Copy Source code ลงใน พื้นที่การเขียน Source code
#include <iostream>
using namespace std;
int main()
{
    int num1 = 15;
    float num2 = 150.1254;
   bool isprogram = true;
   char status = 'a';
   cout << "Hello this C++ programming Lesson 7.";
   cout << endl;
   cout << num1;
   cout << endl;
   cout << num2;
   cout << endl;
   cout << isprogram;
   cout << endl;
   cout << status;

    cin.get();

    return 0;
}

ขั้นที่ 2)
Save Source file ชื่อ test_var_cout.cpp และ ทำการ Complie และ Run เพื่อดูผลลัพธ์

สอน C++ : บทที่ 7 การนำค่าข้อมูลในตัวแปร มาแสดงผลด้วยคำสั่ง cout

อธิบาย Source Code เพิ่มเติม
#include <iostream>
using namespace std;
int main()
{
    
//ประการตัวแปรชื่อ num1 ชนิดข้อมูลจำนวนเต็ม ตั้งค่าเริ่มต้น 15 
    int num1 = 15;

   
//ประการตัวแปรชื่อ num2 ชนิดข้อมูลจำนวนทศนิยม ตั้งค่าเริ่มต้น 150.1254 
    float num2 = 150.1254;

   
//ประการตัวแปรชื่อ isprogram ชนิดข้อมูลค่าความจริง ตั้งค่าเริ่มต้น true 
   bool isprogram = true;

   
//ประการตัวแปรชื่อ status ชนิดข้อมูลอักขระ ตั้งค่าเริ่มต้นตัวอักษร a 
   char status = 'a';

   
//แสดงข้อความ
   cout << "Hello this C++ programming Lesson 7.";

   
//ขึ้นบรรทัดใหม่
   cout << endl;

   
//แสดงค่าในตัวแปร num1 ซึ่งก็คือค่า 15
   cout << num1;
   cout << endl;

    
//แสดงค่าในตัวแปร num2 ซึ่งก็คือค่า 150.125
   ​ // (แสดงทศนิยม แค่ 3 ตำแหน่ง)

   cout << num2;
   cout << endl;

   
//แสดงค่าในตัวแปร isprogram ซึ่งก็คือค่า 1
   // (true เมื่อเอามาแสดงผลแล้วจะได้ค่า 1 ถ้า false จะแสดง 0)

   cout << isprogram;
   cout << endl;

   
//แสดงค่าในตัวแปร status ซึ่งก็คือค่า a
   cout << status;

    cin.get();

    return 0;
}

การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin


การรับข้อมูลจากผู้ใช้ด้วยคำสั่ง cin ครับ ซึ่งการรับข้อมูลจากผู้ใช้นั้น มีไว้เพื่อให้ผู้ใช้งาน (User) ได้ป้อนข้อมูล (Input Data) เข้าไปในโปรแกรม นั่นเองครับ เอาล่ะเราลองมา ดูตัวอย่างแล้วทำตามกันครับ

การรับข้อมูลจากผู้ใช้ด้วย คำสั่ง cin
การรับข้อมูล คือ การเขียน Source Code เพื่อให้โปรแกรมหยุดรอ ให้ผู้ใช้ป้อนค่าข้อมูลผ่านทางคีย์บอร์ด จนกระทั่งเมื่อรับค่าเสร็จแล้ว (กดปุ่ม Enter) จะนำข้อมูลที่ได้ เก็บใส่ ตัวแปร เอาไว้ ดังนั้นถ้ต้องการให้โปรแกรมรับค่าอะไรก็ตามจากผู้ใช้ ก็ใช้วิธีนี้ได้เลยครับ
รูปแบบการรับข้อมูลจากผู้ใช้เก็บในตัวแปร
cin >> ชื่อตัวแปร;
cin >> variable;
ตัวอย่างการใช้
cin >> x;
cin >> number

เงื่อนไข ใช้คำสั่ง cin
อย่าลืม ต้องใช้คู่กับตัวแปร และมี เครื่องหมาย >> คั่นเสมอ 
#include <iostream>
using namespace std;
int main()
{

   int num; 

  
 cout << "Enter Number : ";
   cin >> num;

    cin.get();

    return 0;
}

ลองเขียน Source Code การรับข้อมูลด้วย คำสั่ง cin
ขั้นที่ 1)
ทำการสร้าง Source File ใหม่ใน Dev_C++ จากนั้น ทำการ Copy Source code ลงใน พื้นที่การเขียน Source code
#include <iostream>
using namespace std;
int main()
{
    int num1 = 0;
    float num2 = 0.0;
   char status = ' ';
   cout << "Hello this C++ programming Lesson 8."<< endl;
   cout << "Enter Num1 Data : ";
   cin >> num1;
   cout << "Enter Num2 Data : ";
   cin >> num2;
   cout << "Enter Status Data : ";
   cin >> status;
   cout << endl;

   cout << "Show Data In Variable."<< endl;
   cout << "Num1 : " << num1 << endl;
   cout << "Num2 : " << num2 << endl;
   cout << "Status : " << status << endl;
    cout << endl;
    system("pause");
    return 0;
}

ขั้นที่ 2)
Save Source file ชื่อ test_cin.cpp และ ทำการ Complie และ Run เพื่อดูผลลัพธ์
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
รูปที่ 1 : โปรแกรมกำลังรอรับค่าจาก Keyboard
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
รูปที่ 2 : ผู้ใช้พิมพ์ค่าที่ต้องป้อนลงไป (ในตัวอย่างป้อนค่า 10) เมื่อป้อนเสร็จ กดปุ่ม Enter
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
รูปที่ 3 : โปรแกรมทำงานในคำสั่งต่อไปคือแสดงผลข้อความและตามด้วยรอรับค่า
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
รูปที่ 4 : ทดลองป้อนข้อมูลไปเรื่อยๆ จนจบโปรแกรม
อธิบาย Source Code เพิ่มเติม
#include <iostream>
using namespace std;
int main()
{
    
//ส่วนการประกาศตัวแปร
    int num1 = 0;
    float num2 = 0.0;
   char status = '';

   cout << "Hello this C++ programming Lesson 8."<< endl;
 
   
// แสดงผลก่อนการรับค่าเพื่อบอกผู้ใช้ว่าต้องการข้อมูลอะไร   
   cout << "Enter Num1 Data : ";
  
 // รอรับข้อมูลในในตัวแปร num1
   cin >> num1;

   cout << "Enter Num2 Data : ";
   cin >> num2;
   cout << "Enter Status Data : ";
   cin >> status;

   cout << endl;

   cout << "Show Data In Variable."<< endl;
  
    
// แสดงผลค่าในตัวแปร
   cout << "Num1 : " << num1 << endl;
   cout << "Num2 : " << num2 << endl;
   cout << "Status : " << status << endl;
    cout << endl;
    system("pause");
    return 0;
}

เพิ่มเติม การทำ Label 
การทำ Label คือ การใช้คำสั่ง แสดงผล (cout) ข้อความ เพื่อบอกผู้ใช้โปรแกรมว่า ต้องป้อนค่าอะไรลงในโปรแกรม ขณะที่โปรแกรมกำลังรอรับค่า ลองดูสองตัวอย่างนี้ เปรียบเทียบกันครับ
Source Code การทำ Label
#include <iostream>
using namespace std;
int main()
{
    int num1 = 0;
   // แสดงผล ทำ Label ก่อนการรับค่าเพื่อบอกผู้ใช้ว่าต้องการข้อมูลอะไร   
   cout << "Enter Num1 Data : ";
  
 // รอรับข้อมูลในในตัวแปร num1
   cin >> num1;

   cout << endl;
   system("pause");
   return 0;
}
Output การทำ Label
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin

*** สังเกตได้ว่า ก่อนรับข้อมูล มีข้อความ "Enter Num1 Data : " แสดงออกมาก่อน ทำให้ผู้ใช้รู้ว่า " ต้องใส่ค่าลงไปนะ " 

Source Code การไม่ทำ Label
#include <iostream>
using namespace std;
int main()
{
    int num1 = 0;
   // รอรับข้อมูลในในตัวแปร num1
   cin >> num1;

   cout << endl;
   system("pause");
   return 0;
}
 Output การไม่ทำ Label
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin
สอน C++ : บทที่ 8 การรับข้อมูลจากผู้ใช้ ด้วยคำสั่ง cin

*** สังเกตได้ว่า ก่อนรับข้อมูล ไม่มีข้อความอะไรบอกผู้ใช้เลย ทำให้ผู้ใช้งงว่า " ต้องทำอะไรเนี่ย ? " 

การจัดการอินพุตและเอาท์พุตมาตรฐาน

ใน C++ การจัดการอินพุตและเอาท์พุตนั้นจะอาศัยหลักการของสตรีม (stream) หรือกระแสข้อมูลเป็นองค์ประกอบในการทำงาน สตรีมหมายถึงกระแสข้อมูลที่อยู่ในลักษณะลำดับของข้อมูลอาจจะเป็นตัวอักษร ข้อมูลตัวเลข หรือค่าไบนารี่ก็ได้ โดยจะมีตัวบอกลำดับของข้อมูลและประเภทของข้อมูลว่าเป็นข้อมูลที่เป็นการไหลเข้าไปในสตรีมหรือข้อมูลที่บอกจุดสิ้นสุดของสตรีม การใช้งานสตรีมทำให้โปรแกรมเมอร์ไม่จำเป็นต้องรู้ว่าเบื้องหลังการทำงานของฮาร์ดแวร์ที่จัดการกับข้อมูลนั้นมีเบื้องหลังการทำงานอย่างไร หน้าที่ของโปรแกรมเมอร์มีเพียงแค่จับข้อมูลใส่เข้าไปในสตรีมโดยระบุถึงต้อนทางและปลายทางเท่านั้น หลังจากนั้นสตรีมจะทำหน้าที่ในการอ่าน เขียน และส่งข้อมูลระหว่างกันเองโดยอัตโนมัติ
 สตรีมเป็นออบเจ็กต์ที่ถูกนิยามจากคลาสของ C++ ซึ่งได้สร้างคลาสแยกย่อยออกตามลักษณะของสตรีมที่ต้องการจัดการ เช่น fstream สำหรับจัดการกับการเขียนอ่านไฟล์เป็นต้น แต่ในที่นี้เพื่อไม่ให้เนื้อหายากจนเกินไปนักจึงขอเน้นไปยังสตรีมพื้นฐานที่ใช้ในการรับค่าจากคีย์บอร์ดและแสดงข้อความออกทางจอแสดงผลเท่านั้น

การแสดงผลมาตรฐาน

 โดยทั่วไปแล้วการแสดงผลของโปรแกรมจะหมายถึงการแสดงผลลัพธ์ออกทางหน้าจอซึ่งแทนที่ส่วนแสดงผลลัพธ์ด้วยคำสั่ง cout และตัวดำเนินการบอกทิศทางของข้อมูลในสตรีมที่เรียกว่า “insertion operator” (<<) ดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
#include<iostream>
using namespace std;
void main()
{
  cout << "Hello World!";
}

สาเหตุที่ต้องใช้สัญลักษณ์ “ ” อัญประกาศ หรือ เครื่องหมายคำพูด ที่ครอบข้อความ Hello World! เพื่อทำการแปลงข้อความให้อยู่ในรูปของค่าคงที่ของรหัสตัวอักษรที่นำมาประกอบกันเป็นข้อความสำหรับตัวคอมไพเลอร์ ดังนั้นในการแสดงผลตัวอัญประกาศจะไม่ถูกนำมาแสดงผล

      ในกรณีที่เป็นการแสดงผลตัวอักษรเพียงตัวเดียวจะใช้สัญลักษณ์ อัญประกาศเดี่ยว ‘ ’ เพื่อบอกให้คอมไพเลอร์ของ C++ รู้ว่าข้อมูลต่อไปนี้จะเป็นเพียงค่าของตัวอักษรเพียงแค่ตัวเดียว ดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
 
void main ()
{
  char gender = 'm';
  cout << gender;
}

      หากไม่ต้องการใช้คำสั่ง using namespace std; ทุกครั้งที่มีการเรียกใช้ไลบรารี iostream ต้องเขียนคำสั่ง cout ใหม่เป็น std::cout เสมอ เช่น std::cout << gender;

      ในการใช้คำสั่ง cout การเว้นวรรคภายใต้อัญประกาศจะถูกนำมาแสดงผลด้วย และสามารถเชื่อมประโยค หรือ ตัวแปร เข้าด้วยกันได้โดยอาศัยตัว insertion operator (<<) ดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
 
void main ()
{
  char gender = 'm';
  cout << "Hello, " << "your's gender is " << gender <<".";
}



รูปที่ 1. ผลลัพธ์ที่ได้จากโค้ดตัวอย่างด้านบน

      คำสั่ง cout จะไม่ใส่คำสั่งจบและขึ้นบรรทัดใหม่ให้ หากต้องการให้ขึ้นบรรทัดใหม่ให้ใช้ Escape codes “\n” หรือ endl ดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
void main ()
{
  char gender = 'm';
  cout << "First sentence.\n";
  cout << "Second sentence." << endl;
}

ผลลัพธ์จากการใช้ “n” และ endl

รูปที่ 2. ผลลัพธ์จากการใช้ “\n” และ endl

      สำหรับ “\n” และ endl จะให้ผลลัพธ์ที่เหมือนกันแต่ endl จะทำการ Flush buffer ด้วยซึ่งจะมีผลกับสตรีมที่มีลักษณะการใช้งานบัฟเฟอร์ แต่คำสั่ง cout จะจัดการกับสตรีมพื้นฐานทั่ว ๆ ไปที่ไม่จำเป็นต้องอาศัยบัฟเฟอร์ในกระบวนการทำงานดังนั้นในการใช้ “\n” และ endl จึงไม่มีผลแตกต่างกัน

เนื่องจากโดยปรกติแล้วก่อนทำการส่งข้อมูลระหว่างต้นทางกับปลายทางด้วยสตรีมที่มีขนาดใหญ่มาก เช่นไฟล์วีดีโอ มักจะมีการเก็บข้อมูลไว้ในหน่วยความจำก่อนซึ่งเรียกหน่วยความจำสำหรับเก็บข้อมูลชั่วคราวนี้ว่าบัฟเฟอร์ (Buffer) และจะทำการส่งข้อมูลไปยังปลายทางเมื่อข้อมูลในบัฟเฟอร์นั้นเต็มแล้ว หากเป็นการ Flush buffer จะเป็นการส่งข้อมูลไปทันทีโดยไม่สนใจว่าบัฟเฟอร์นั้นมีข้อมูลเต็มแล้วหรือไม่

เนื่องจากโดยปรกติแล้วก่อนทำการส่งข้อมูลระหว่างต้นทางกับปลายทางด้วยสตรีมที่มีขนาดใหญ่มาก เช่นไฟล์วีดีโอ มักจะมีการเก็บข้อมูลไว้ในหน่วยความจำก่อนซึ่งเรียกหน่วยความจำสำหรับเก็บข้อมูลชั่วคราวนี้ว่าบัฟเฟอร์ (Buffer) และจะทำการส่งข้อมูลไปยังปลายทางเมื่อข้อมูลในบัฟเฟอร์นั้นเต็มแล้ว หากเป็นการ Flush buffer จะเป็นการส่งข้อมูลไปทันทีโดยไม่สนใจว่าบัฟเฟอร์นั้นมีข้อมูลเต็มแล้วหรือไม่

การจัดการอินพุตมาตรฐาน

      โดยทั่วไปแล้วอุปกรณ์ที่รับอินพุตจากผู้ใช้จะหมายถึงคีย์บอร์ด ซึ่งใช้คำสั่ง cin และสัญลักษณ์ >> เพื่อรับข้อมูลจากคีย์บอร์ดดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
 
void main()
{
  char my_charector;
  cout << "Press a character and press return: ";
  cin >> my_charector;
  cout << my_charector;
}

      คำสั่ง cin จะทำการส่งข้อมูลไปยังตัวแปรหลังจากกดปุ่ม Enter แล้วนอกจากนี้คำสั่ง cin สามารถรับค่าได้หลาย ๆ ค่าในคราวเดียวกันได้เช่นเดียวกับ cout เช่น 

1
cin >> XX >> YY;

      จากโค้ดตัวอย่างด้านบนผู้ใช้งานโปรแกรมสามารถใส่ข้อมูลให้กับตัวแปรทั้งสองตัวได้ในคราวเดียว ซึ่งมีลักษณะในการใส่ข้อมูลเพื่อแยกข้อมูลของตัวแปรแต่ละตัวให้ออกจากกันด้วยการกดปุ่ม Tab, Spacebar หรือ Enter เรียกอักขระที่ได้จากการกดปุ่มเหล่านี้ว่าอักขระว่าง (blank space character)

      คำสั่ง cin จะส่งค่าตามลักษณะของประเภทตัวแปรที่รอรับค่าอยู่ หากต้องการรับค่าเป็นตัวเลข ก็ให้ใช้ตัวแปรประเภท int มารอรับค่า ซึ่งอาจเป็นสาเหตุให้เกิดความผิดพลาดได้หากโปรแกรมไม่คืนค่าตามที่คาดหวังไว้ ตัวอย่าง เช่น การใช้ตัวแปรรอรับค่าแต่ผู้ใช้กลับป้อนข้อมูลเป็นข้อความเข้ามาดังตัวอย่างต่อไปนี้

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
 
int main()
{
  int my_value;
  cout << "Give a integer: ";
  cin >> my_value;
  cout << "Your integer is: " << my_value << "\n";
}


ข้อผิดพลาดที่เกิดจากผู้ใช้งานใส่ข้อมูลผิดพลาด

รูปที่3. ข้อผิดพลาดที่เกิดจากผู้ใช้งานใส่ข้อมูลผิดพลาด

      หากตัวแปรที่รอรับค่าเป็น int ซึ่งในที่นี้ได้แก่ตัวแปร my_value จากตัวอย่างหากผู้ใช้งานป้อนค่าเป็น 1.5 ผลลัพธ์ที่ได้จะเป็น 1 ส่วน 0.5 จะถูกตัดทิ้งไปเนื่องจากตัวแปรที่รับค่าเป็น int ในขณะเดียวกันหากผู้ใช้งานป้อนค่าเป็นข้อความเข้ามาผลลัพธ์ที่ได้จะผิดพลาดได้ดังที่แสดงไว้ในรูปด้านล่าง

ผลลัพธ์ที่เกิดจากการป้อนข้อความให้กับตัวแปรรับค่าแบบ int

รูปที่ 4. ผลลัพธ์ที่เกิดจากการป้อนข้อความให้กับตัวแปรรับค่าแบบ int

String และ cin

      ในการรับข้อมูลแบบ string ด้วย cin ต้องทำการเรียกใช้ไลบรารีสำหรับจัดการสตริง ด้วยคำสั่ง #include <string> จึงจะสามารถประกาศประเภทตัวแปรแบบ string ได้

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include<string>
using namespace std;
 
void main()
{
  string sitename;
  cout << "What's your favorite website? ";
  cin >> sitename;
  cout << "Hello " << sitename << "\n";
}

      เนื่องจากคำสั่ง cin จะหยุดอ่านข้อมูลทันทีที่พบอักขระว่างดังนั้นในตัวอย่างข้างต้นหากผู้ใช้ใส่ข้อมูลเป็น “DEVXCO Website” ข้อมูลที่ถูกส่งให้กับตัวแปร sitename จะมีเพียง DEVXCO เท่านั้น

ข้อจำกัดของคำสั่ง cin

รูปที่ 5. ข้อจำกัดของคำสั่ง cin

      จากตัวอย่างข้างต้นจะเห็นได้ว่าแม่ว่าในการใส่ข้อมูลผู้เขียนได้บอกรายละเอียดในการใส่ข้อมูลไว้แล้ว แต่หากผู้ใช้งานไม่ใส่ใจก็อาจทำให้เกิดข้อผิดพลาดในลักษณะนี้ได้ ในการแก้ปัญหาจากผู้ใช้ในลักษณะนี้เราจะใช้คำสั่ง getline() เพื่อแก้ปัญหา

String และ getline()

      คำสั่ง getline() จะนำมาใช้งานในกรณีที่ต้องการอ่านข้อมูลทั้งบรรทัด เราสามารถใช้คำสั่ง getline() และส่งข้อมูลอินพุตต่อไปในลักษณะของสตรีมเช่น คำสั่ง cin เพื่ออ่านข้อมูลจากอุปกรณ์อินพุตมาตรฐาน หรือ จากสตรีมอื่น ๆ เช่น การอ่านข้อมูลจากไฟล์ การใช้คำสั่ง getline() พร้อมกับ cin มีลักษณะการทำงานดังต่อไปนี้

#include<iostream>
#include<string>
using namespace std;
 
void main()
{
  string sitename;
  cout << "What's your favorite website? ";
  getline (cin, sitename);
  cout << "I Like " << sitename << '\n';
}



 การใช้ getline และ cin

รูปที่ 6. การใช้ getline และ cin 

      หากได้ทำการทดสอบตัวอย่างการทำงานด้านบนจะเห็นได้ว่าข้อมูลทุกอย่างที่ป้อนเข้าไปจะถูกบันทึกไว้เมื่อผู้ใช้กดปุ่ม Enter บนคีย์บอร์ดก่อนเท่านั้น หากต้องการใช้งานอักขระอื่นแทนที่จุดสิ้นสุดการใส่ข้อมูลด้วยการกดปุ่มอื่นแทนปุ่ม Enter ได้โดยการเพิ่มพารามิเตอร์ตัวที่สามเข้าไปยังคำสั่ง getline()

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include<string>
using namespace std;
 
void main()
{
  string sitename;
  cout << "What's your favorite website? ";
  getline (cin, sitename, '#');
  cout << "I Like " << sitename << '\n';
}



การกำหนดอักขระสิ้นสุดการใส่ข้อมูลใน getline()

รูปที่ 7. การกำหนดอักขระสิ้นสุดการใส่ข้อมูลใน getline()

      จากตัวอย่างได้กำหนดให้อักขระที่สิ้นสุดการใส่ข้อมูลคือ ‘#’ ดังที่กำหนดไว้ในพารามิเตอร์ที่ 3 ของคำสั่ง getline() อย่างไรก็ดีผู้ใช้ยังคงต้องกดปุ่ม Enter เพื่อสิ้นสุดการทำงานของคำสั่ง cin เช่นเดิมแต่ตราบใดที่ผู้ใช้งานโปรแกรมยังไม่กดปุ่ม ‘#’ คำสั่ง cin จะไม่ถือว่าการใส่ข้อมูลสิ้นสุดแล้ว 

 Input Output with cin and cout



 User Input with cin




Using Variables with cout