日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《C和C++代码精粹》——1.8 标准流

發布時間:2025/7/14 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《C和C++代码精粹》——1.8 标准流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節書摘來自異步社區出版社《C和C++代碼精粹》一書中的第1章,第1.8節,作者: 【美】Chuck Allison,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。

1.8 標準流

C和C++代碼精粹
C++中有4個預定義的流:cin(標準輸入),cout(標準輸出),cerr(標準錯誤),clog(標準錯誤)。除了cerr外其余都是全緩沖流。就像stderr一樣,cerr的行為好象是非緩沖的,但事實上它是單元緩沖的,也就是說它在處理完每一個對象而不是每一個字節后會自動清除緩沖。例如,帶有單元緩沖的語句:

cerr<<“hello”;
緩沖處理5個字符,然后清除緩沖區。一個非緩沖處理的流會立即發送每個字符到它的最終目的地。

程序清單1.5 通過引用從函數中返回一個對象

// 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

下列程序將標準輸入拷貝到標準輸出:

// copy1.cpp:將標準輸入拷貝到標準輸出 #include <iostream> using namespace std; main() { char c; while (cin.get(c)) cout.put(c); }

注意到標準頭文件名(即iostream)不再使用一個.h的后綴。幾乎所有C++標準庫中的內容,包括流,都駐留于名字空間(namespace std)中。一個名字空間就是一個包括聲明在內的已命名的范圍。上面第二行using指令指示編譯器在翻譯期間查找聲明的名字時搜尋std。標準C頭文件也存在于C++程序的std標準名字空間中,并以字母c作為前綴。為了包含,可以這樣做:

#include < cstdio > using namespace std; 或用通常的#include<stdio.h>。

一個從流中讀取的函數稱為提取器(extractor),而一個輸出函數稱為插入器(inserter)。get提取器從流中把下一個字節存放到它的char引用參數中,像多數流成員函數一樣,get返回流本身。當一個流出現在像上面的while循環的布爾型上下文中,如果數據成功傳遞,它檢驗為true;如果有錯誤,則為false。就像試圖過了文件尾還要讀文件一樣。盡管這樣簡單的布爾型檢驗在大多數時間能滿足,但你可以在任何時候使用下面這些布爾型成員函數對流的狀態進行詢問:

bad ( ) 嚴重錯誤 (流被誤用) fail ( ) 轉換錯誤 (數據不正確但流正常) eof ( ) 文件尾 good ( ) 上述都不是

下例程序實現逐行拷貝:

// 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,如果遇到一個換行符就停下來,添加一個空字節,丟棄換行符。輸出流使用左移運算符作為插入器。任何對象,無論是系統預定義的還是用戶自定義的,都可以是流中插入鏈的一部分。你必須自己重載運算符<<用于自己的類中。

程序清單1.6是一個說明用>>運算符來實現提取功能的程序。由于在C中,通常使用stderr作為提示(因為它沒有被緩沖),就會在C++中使用cerr:

cerr << “Please enter an integer:” ; cin >> i;

這在C++中不是必需的,因為,cout與cin是綁定在一起的,當輸出請求輸入時,一個依賴于輸入流的輸出流被自動地刷新。如果需要強制刷新,可以使用一個flush成員函數。

程序清單1.6 回應值和地址的整型提示符

// int.cpp:為一個整數提示 #include <iostream> using namespace std; main() { int i; cout << "請輸入一個整數: "; cin >> i; cout << "i == " << i << '\n'; cout << "&i == " << &i << '\n'; } //例子執行結果: 請輸入一個整數:10 i == 10 &i == 0xfff4

物理地址是以定義實現的格式打印的,通常是16進制,當然字符數組是個例外,打印的是字符串的值而不是地址。要想打印C類型字符串的地址,得把它轉向void * :

char s[ ] = …; cout << ( void * ) s<< ‘\n’; // 打印地址

操作符>>默認方式是跳過空格。程序清單1.7的程序利用這個特點來計算文本文件的字數。提取字符串操作類似于scanf中的%s格式化標志。在讀取字符時,也可以關閉這種跳過空格的方式(見程序清單1.8)。

本文僅用于學習和交流目的,不代表異步社區觀點。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接。

總結

以上是生活随笔為你收集整理的《C和C++代码精粹》——1.8 标准流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。