C++ 標(biāo)準(zhǔn)庫提供了一組廣泛的的輸入/輸出功能,我們將在隨后的章節(jié)中展開。本章將討論 C++ 編程所需的最基本和最常見的 I/O 操作。
C++ I/O發(fā)生在流中,流是一種字節(jié)序列。如果字節(jié)流從一個設(shè)備(如鍵盤、磁盤驅(qū)動器,或網(wǎng)絡(luò)連接等)到主內(nèi)存,這稱為輸入操作(input operation)。如果字節(jié)從主內(nèi)存流向一個設(shè)備(如顯示屏,打印機,磁盤驅(qū)動器,或網(wǎng)絡(luò)連接等),這就是所謂的輸出操作(output operation)。
下邊列出對于 C++ 程序重要的頭文件:
頭文件 | 功能和描述 |
---|---|
<iostream> | 這個頭文件定義了 cin、cout、cerr 和 clog 對象,它們分別對應(yīng)于標(biāo)準(zhǔn)輸入流,標(biāo)準(zhǔn)輸出流,無緩沖標(biāo)準(zhǔn)錯誤流和有緩沖標(biāo)準(zhǔn)錯誤流。 |
<iomanip> | 這個頭文件聲明了用于執(zhí)行格式化 I/O 操作的一系列服務(wù),即所謂的參數(shù)化流操作,如 setw 和 setprecision。 |
<fstream> | 這個頭文件聲明了基于用戶控制的文件處理服務(wù)。我們將在文件和流相關(guān)的章節(jié)更詳細(xì)討論關(guān)于它的內(nèi)容。 |
預(yù)定義的對象 cout 是 ostream 類的一個實例。cout 對象通常連接到標(biāo)準(zhǔn)輸出設(shè)備,一般是顯示屏。cout 和流插入運算符聯(lián)合使用,流插入運算符寫為 <<
,即兩個表示小于的符號,如以下示例所示。
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
編譯和執(zhí)行上面的代碼,運行結(jié)果如下:
Value of str is : Hello C++
C++ 編譯器也決定了輸出的變量數(shù)據(jù)類型并選擇適當(dāng)?shù)牧鞑迦脒\算符來顯示值。<<
操作符重載了多種輸出數(shù)據(jù)項(包括各種內(nèi)置類型:整數(shù)、浮點數(shù)、雙精度浮點數(shù)、字符串和指針類型的值)。
插入運算符<<
在一個語句中可能不止一次被使用,如上所示,endl 寫在結(jié)束的時候用于添加一個新行。
預(yù)定義對象 cin 是 istream 類的一個實例。cin 對象通常用于標(biāo)準(zhǔn)輸入設(shè)備,一般是鍵盤。cin 和流提取運算符聯(lián)合使用,流提取符號寫為>>
即兩個表示大于的符號,如以下示例所示。
#include <iostream>
using namespace std;
int main( )
{
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
編譯和執(zhí)行上面的代碼,它會提示輸入一個名稱。輸入一個值,然后回車,運行結(jié)果如下:
Please enter your name: cplusplus
Your name is: cplusplus
C++ 編譯器也決定輸入值的數(shù)據(jù)類型和選擇適當(dāng)?shù)牧魈崛∵\算符提取值并將其存儲在給定的變量。
流提取操作符>>
可以在一個聲明中不止一次使用。請求多個數(shù)據(jù)時,可采用以下書寫形式:
cin >> name >> age;
上述表達式等價于下面兩個聲明語句:
cin >> name;
cin >> age;
預(yù)定義對象 cerr 是 ostream 類的一個實例。cerr 對象通常附加到標(biāo)準(zhǔn)錯誤設(shè)備,這一般也是一個顯示屏,但對象 cerr 是無緩存的,每當(dāng)有流插入到 cerr 會導(dǎo)致其輸出立即出現(xiàn)。
cerr 也與流插入操作符一起使用,如以下示例所示。
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Unable to read....";
cerr << "Error message : " << str << endl;
}
編譯和執(zhí)行上面的代碼,運行結(jié)果如下:
Error message : Unable to read....
預(yù)定義對象 clog 是 ostream 類的一個實例。clog 對象通常附加到標(biāo)準(zhǔn)錯誤設(shè)備,這一般也是一個顯示屏,但對象 clog 是有緩沖的。這意味著每個插入的 clog 會暫存在緩沖區(qū)中,直到緩沖區(qū)滿或者緩沖區(qū)刷新才會產(chǎn)生一次輸出。
clog 也與流插入操作符一起使用,如以下示例所示。
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
編譯和執(zhí)行上面的代碼,運行結(jié)果如下:
Error message : Unable to read....
在這些小例子中,你可能無法看出 cout,cerr,clog 的區(qū)別,但在編寫、執(zhí)行大項目時,差異就變得顯而易見了。所以這是很好的應(yīng)用實踐:使用 cerr 流顯示錯誤消息,而使用 clog 顯示其他日志信息。