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