c primer 第八章 IO庫

2021-08-30 15:31:17 字數 3843 閱讀 7561

1.常用的io庫設施

istream型別,提供輸入操作

ostream型別,提供輸出操作

cin,乙個istream物件,從標準輸入讀資料

cout,乙個ostream物件,向標準輸出寫入資料

cerr,乙個ostream物件,向標準錯誤寫資訊。

//>>:從乙個istream物件讀資料

//<<:向乙個ostream物件寫入資料

2.io庫型別和標頭檔案

2.1.iostream標頭檔案中包含類型別

用來讀寫流

istream,wistream,ostream,wostream,iostream,wiostream

2.2.fstream標頭檔案中包含類型別

用來讀寫檔案

ifstream,wifstream, ofstream, wofstream, fstream, wfstream

3.3.sstream標頭檔案中包含類型別

用來讀寫string

istringstream,wistringstream,ostringstream,wostringstream,stringstream,wstringstream

3.對寬字元支援

標準庫一開始只支援char型別,後來支援wchar_t(寬字元)型別

寬字元版本的函式和型別的名字以乙個w開始,如wcin,wcout, wcerr.

寬字元版本的型別和物件與其普通char版本的型別定義在同乙個標頭檔案中。

本部分後面介紹的標準庫流特性都可以無差別的應用於普通流,檔案流,string流,以及char或寬字元流版本。

4.io物件無拷貝或賦值。讀寫乙個io物件會改變其狀態,因此傳遞和返回的引用不能是const的。

5.io操作容易發生錯誤,一些錯誤是可恢復的,而其他錯誤則發生在系統深處,已經超出了應用程式可以修正的範圍。

io庫條件狀態:

strm指流型別,可以是普通流,檔案流,string流及其正常,寬字元版本

strm::iostate iostate是一種機器相關的型別,提供了表達條件狀態的完整功能。

strm::badbit 用來指出流已經崩潰

strm::failbit 用來指出乙個io操作失敗了

strm::eofbit 用來指出流到達了檔案結束

strm::goodbit 用來指出流未處於錯誤狀態

s.eof() 若流s的eofbit置位,返回true

s.fail() 若流s的failbit置位,返回true

s.bad() 若流s的badbit置位,返回true

s.good() 若流s處於有效狀態,返回true

s.clear() 將流s中所有條件狀態位復位,將流的狀態設定為有效,返回void。

s.clear(flags) 根據給定的flags標誌位,將流s中對應的條件狀態位復位。flags的型別為strm::iostate。返回void。作用和setstate一樣?

s.setstate(flags) 根據給定的flags標誌位,將流s中對應的條件狀態為置位。flags的型別為strm::iostate。返回void

s.rdstate() 返回流的當前條件狀態,返回值型別為strm::iostate

乙個流一旦發生錯誤,其上後續的io操作都會失敗。只有當乙個流處於無錯狀態時,才可從它讀取資料,向它寫入資料。

因此,**通常在使用乙個流之前檢查它是否處於良好狀態。確定乙個流物件狀態的最簡單的方法是將它當作乙個條件來使用。流保持有效狀態時,條件運算結果是true。

badbit,表示系統級錯誤,

failbit,表示錯誤,如到達檔案結束位置,期望和實際讀取的型別不符等。發生系統級錯誤時,failbit也會被置位。

eofbit,表示到達檔案結束位置

goodbit的值為0,表示流未發生錯誤。

如果badbit,failbit,eofbit中任乙個被置位,則檢測流狀態的條件會失敗。

6.輸出緩衝區重新整理

每個輸出流都管理乙個緩衝區,用來儲存程式讀寫的資料。

有了緩衝機制,作業系統可以將程式的多個輸出操作組合成單一的系統級寫操作。由於裝置的寫操作耗時,允許作業系統將多個輸出操作組合為單一的裝置寫操作可以帶來很大的效能提公升。

導致緩衝重新整理(即,資料真正寫入到輸出裝置或檔案)的原因有很多:

a.程式正常結束,作為main函式return操作一部分。緩衝重新整理被執行。

b.緩衝區滿時,需要重新整理緩衝,而後新的資料才能繼續寫入緩衝區。

b.可使用操作符如endl來顯示重新整理緩衝區。

d.在每個輸出操作後,我們可以用操縱符unitbuf設定流的內部狀態,來清空緩衝區。預設下,對cerr是設定unitbuf的,因此寫到cerr的內容是立即重新整理的。

e.乙個輸出流可能被關聯到另乙個流。這種情況下,當讀寫被關聯的流時,關聯到的流的緩衝區會被重新整理。如預設下,cin,cerr都關聯到cout,因此,讀cin或寫cerr都會導致cout的緩衝區被重新整理。

endl,完成換行並重新整理緩衝區的工作。

flush,重新整理緩衝區,不輸出額外字元。

ends,向緩衝區插入乙個空字元,然後重新整理緩衝區。

//cout<<「hi」《程式異常終止時,輸出緩衝區不會被重新整理。

當乙個輸入流被關聯到乙個輸出流時,任何從輸入流讀取資料的操作都會先重新整理關聯的輸出流。標準庫的cout和cin是關聯的。

對流物件可以用tie實現關聯

strm.tie() // 返回指向本流物件關聯到的乙個輸出流的指標

strm.tie(&ostrm) // 將流物件strm關聯到ostrm

7.檔案流

fstream,ifstream,ofstream // 讀取、寫入、讀寫

7.1.檔案流特有操作:

fstream fstrm; //建立乙個未繫結的檔案流。fstream是乙個型別

fstream fstrm(s)//建立乙個fstream,並開啟名為s的檔案

fstream fstrm(s,mode)//與前乙個相似,但按指定mode開啟檔案

fstrm.open(s); // 開啟名為s的檔案

fstrm.close();//關閉

fstrm.is_open(); // 返回乙個bool值,指出乙個fstrm關聯的檔案是否成功開啟且尚未關閉

接收乙個iostream型別引用或指標引數的函式,可以用乙個對應的fstream或sstream型別來呼叫。

如果 檔案流open失敗,failbit會被置位。open成功,會設定流的狀態,使good()為true。。

當乙個fstream物件被銷毀時,close會自動被呼叫。

8.string流

stringstream特有操作

sstream strm;

sstream strm(s); // strm儲存乙個string s的拷貝。

strm.str(); // 返回strm儲存的string的拷貝。

strm.str(s); // 把string s拷貝到strm中。

當我們的某些工作是對整行文字進行處理,而其他工作是處理行內的單個單詞的時候可以使用;

struct personinfo

string line,word;

vector people;

while(getline(cin,line))

for(const auto &entry:people)

else

formatted << 「 」<}if (bainums.str().empty())

os

cerr<<」input error: 」<9.標準庫流分析

優勢是簡單,易用,可見到原始碼。

以後嘗試多用標準庫流實現io控制,減少使用windows檔案api。

使用標準庫的東西直接看相應原始碼替代看書,直接看原始碼,就是最好的了解學習。

C Primer 第八章 IO庫

1.3 管理輸出緩衝 2.檔案輸入輸出 2.2 檔案模式 3.string 標準庫的核心就是很多容器和一族泛型演算法,這些設施幫助我們編寫簡潔高效的程式。標準庫會關注那些薄記操作的細節,特別是記憶體管理,這樣我們的程式就可以將全部的注意力投入到需要解決的問題上。io庫定義了讀寫內建型別值的操作。此外...

C Primer 筆記 第八章 IO庫

io物件無拷貝和賦值。unitbuf 使接下來每次輸出操作後都重新整理緩衝區,之後用 nounnitbuf 取消。輸入流與輸出流關聯時,任何試圖從輸入流讀取資料的操作都會重新整理它所關聯的輸出流。ostream old cin.tie nullptr 這句語句將 cin 原來關聯的輸出流存入 old...

C primer 第八章IO庫 小結

1 io物件無拷貝或賦值函式 2 條件狀態 將流當作條件使用的 就等價於 fail 而eof和bad操作只能表示特定的錯誤。3 管理條件狀態 可以通過儲存iostate來儲存cin狀態,當cin在其他函式使用完之後恢復。4 管理輸出緩衝 以下三種方式可以強制重新整理輸出緩衝 可通過cin.tie o...