《C和C++代码精粹》——1.8 标准流
本節(jié)書摘來自異步社區(qū)出版社《C和C++代碼精粹》一書中的第1章,第1.8節(jié),作者: 【美】Chuck Allison,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號查看。
1.8 標(biāo)準(zhǔn)流
C和C++代碼精粹
C++中有4個預(yù)定義的流:cin(標(biāo)準(zhǔn)輸入),cout(標(biāo)準(zhǔn)輸出),cerr(標(biāo)準(zhǔn)錯誤),clog(標(biāo)準(zhǔn)錯誤)。除了cerr外其余都是全緩沖流。就像stderr一樣,cerr的行為好象是非緩沖的,但事實上它是單元緩沖的,也就是說它在處理完每一個對象而不是每一個字節(jié)后會自動清除緩沖。例如,帶有單元緩沖的語句:
cerr<<“hello”;
緩沖處理5個字符,然后清除緩沖區(qū)。一個非緩沖處理的流會立即發(fā)送每個字符到它的最終目的地。
程序清單1.5 通過引用從函數(shù)中返回一個對象
// retref.cpp:返回一個引用 #include <stdio.h> int & current(); // 返回一個引用 int a[4] = {0,1,2,3}; int index = 0; main() { current() = 10; index = 3; current() = 20; for (int i = 0; i < 4; ++i) printf("%d ",a[i]); putchar('\n'); } int & current() { return a[index]; } //輸出: 10 1 2 20下列程序?qū)?biāo)準(zhǔn)輸入拷貝到標(biāo)準(zhǔn)輸出:
// copy1.cpp:將標(biāo)準(zhǔn)輸入拷貝到標(biāo)準(zhǔn)輸出 #include <iostream> using namespace std; main() { char c; while (cin.get(c)) cout.put(c); }注意到標(biāo)準(zhǔn)頭文件名(即iostream)不再使用一個.h的后綴。幾乎所有C++標(biāo)準(zhǔn)庫中的內(nèi)容,包括流,都駐留于名字空間(namespace std)中。一個名字空間就是一個包括聲明在內(nèi)的已命名的范圍。上面第二行using指令指示編譯器在翻譯期間查找聲明的名字時搜尋std。標(biāo)準(zhǔn)C頭文件也存在于C++程序的std標(biāo)準(zhǔn)名字空間中,并以字母c作為前綴。為了包含,可以這樣做:
#include < cstdio > using namespace std; 或用通常的#include<stdio.h>。一個從流中讀取的函數(shù)稱為提取器(extractor),而一個輸出函數(shù)稱為插入器(inserter)。get提取器從流中把下一個字節(jié)存放到它的char引用參數(shù)中,像多數(shù)流成員函數(shù)一樣,get返回流本身。當(dāng)一個流出現(xiàn)在像上面的while循環(huán)的布爾型上下文中,如果數(shù)據(jù)成功傳遞,它檢驗為true;如果有錯誤,則為false。就像試圖過了文件尾還要讀文件一樣。盡管這樣簡單的布爾型檢驗在大多數(shù)時間能滿足,但你可以在任何時候使用下面這些布爾型成員函數(shù)對流的狀態(tài)進(jìn)行詢問:
bad ( ) 嚴(yán)重錯誤 (流被誤用) fail ( ) 轉(zhuǎn)換錯誤 (數(shù)據(jù)不正確但流正常) eof ( ) 文件尾 good ( ) 上述都不是下例程序?qū)崿F(xiàn)逐行拷貝:
// copy2.cpp: 逐行拷貝 #include <iostream> using namespace std; main() { const size_t BUFSIZ = 128; char s[BUFSIZ]; while (cin.getline(s,BUFSIZ)) cout << s << '\n'; }getline提取器讀取BUFSIZ-1個字符給s,如果遇到一個換行符就停下來,添加一個空字節(jié),丟棄換行符。輸出流使用左移運算符作為插入器。任何對象,無論是系統(tǒng)預(yù)定義的還是用戶自定義的,都可以是流中插入鏈的一部分。你必須自己重載運算符<<用于自己的類中。
程序清單1.6是一個說明用>>運算符來實現(xiàn)提取功能的程序。由于在C中,通常使用stderr作為提示(因為它沒有被緩沖),就會在C++中使用cerr:
cerr << “Please enter an integer:” ; cin >> i;這在C++中不是必需的,因為,cout與cin是綁定在一起的,當(dāng)輸出請求輸入時,一個依賴于輸入流的輸出流被自動地刷新。如果需要強(qiáng)制刷新,可以使用一個flush成員函數(shù)。
程序清單1.6 回應(yīng)值和地址的整型提示符
// int.cpp:為一個整數(shù)提示 #include <iostream> using namespace std; main() { int i; cout << "請輸入一個整數(shù): "; cin >> i; cout << "i == " << i << '\n'; cout << "&i == " << &i << '\n'; } //例子執(zhí)行結(jié)果: 請輸入一個整數(shù):10 i == 10 &i == 0xfff4物理地址是以定義實現(xiàn)的格式打印的,通常是16進(jìn)制,當(dāng)然字符數(shù)組是個例外,打印的是字符串的值而不是地址。要想打印C類型字符串的地址,得把它轉(zhuǎn)向void * :
char s[ ] = …; cout << ( void * ) s<< ‘\n’; // 打印地址操作符>>默認(rèn)方式是跳過空格。程序清單1.7的程序利用這個特點來計算文本文件的字?jǐn)?shù)。提取字符串操作類似于scanf中的%s格式化標(biāo)志。在讀取字符時,也可以關(guān)閉這種跳過空格的方式(見程序清單1.8)。
本文僅用于學(xué)習(xí)和交流目的,不代表異步社區(qū)觀點。非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接。
總結(jié)
以上是生活随笔為你收集整理的《C和C++代码精粹》——1.8 标准流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《数字图像处理与机器视觉——Visual
- 下一篇: 《HTML5移动应用开发入门经典》——