C primer 學習筆記 第八章 IO庫

2021-08-28 08:03:45 字數 3129 閱讀 1859

io庫型別和標頭檔案

頭檔案型別iostream(流)

istream,wistream從流讀取資料

ostream,wostream向流寫入資料

iostream,wiostream讀寫流

fstream(檔案)

ifstream,wifstream從檔案讀取資料

ofstream,wofstream向檔案寫入資料

fstream,wfstream讀寫檔案

sstream(string)

istringstream,wistringstream從string讀取資料

ostringstream,wostringstream向string寫入資料

stringstream,wstringstream讀寫string

io型別間的關係

標準庫使我們能忽略這些不同型別的流之間的差異,這是通過繼承機制。

型別ifstream和istringstream都繼承自istream;型別ofstream和ostringstream都繼承自ostream。

本節剩下部分所介紹的標準庫流特性都可以無差別地應用於普通流、檔案流和string流,以及char或寬字元流版本。

由於不能拷貝io物件,因此我們也不能將形參或返回型別設定為流型別

進行io操作的函式通常以引用方式傳遞和返回流。

讀寫乙個io物件會改變其狀態,因此傳遞和返回的引用不能是const的。

io庫條件狀態

strm::iostate

strm::badbit

strm::failbit

strm::eofbit

strm::goodbit

s.eof()

s.fail()

s.bad()

s.clear()

s.clear(flags)

s.setstate(flags)

s.rdstate()

確定乙個流物件的狀態的最簡單的方法是將它當做乙個條件來使用,如果輸入操作成功,流保持有效狀態,則條件為真:

while(cin>>word)

//ok::讀操作成功

查詢流的狀態

管理流的狀態

以上兩種行為涉及到位的運算

重新整理輸出緩衝區

操縱符endl,完成換行並重新整理緩衝區

flush重新整理緩衝區,但是不輸出任何額外的字元

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

cout<<"hi!"<unitbuf操縱符

cout《警告:如果程式崩潰,輸出緩衝區是不會被重新整理的。當乙個程式崩潰後,它輸出的資料很可能停留在輸出緩衝區中等待列印

關聯輸入和輸出流

當乙個輸入流被關聯到乙個輸出流時,任何試圖從輸入讀取資料的操作都會先重新整理關聯的輸出流。

tie有兩個過載的版本:乙個版本不帶引數,返回指向輸出流的指標。如果關聯到乙個輸出流,則返回指向這個流的指標,如果未關聯到流,則返回空指標。tie的第二個版本接受乙個指向ostream的指標,將自己關聯到此ostream。即,x.tie(&o)將x關聯到輸出流o。

cin.tie(&cout); //將cin與cout關聯在一起

//old_tie指向當前關聯到cin的流(如果有的話)

ostream &old_tie=cin.tie(nullptr); //cin不再與其他流關聯

cin.tie(&cerr); //讀取cin會重新整理cerr而不是cout

cin.tie(old_tie); //重建cin和cout的正常關聯

每個流同時最多關聯到乙個流,但多個流可以同時關聯到同乙個ostream。

標頭檔案fstream定義了三個型別類支援檔案io:ifstream從乙個給定檔案讀取資料,ofstream向乙個給定檔案寫入資料,以及fstream可以讀寫給定檔案

fstream特有的操作

fstream fstrm

建立乙個未繫結的檔案流

fstream fstrm(s);

建立乙個fstream,並開啟名為s的檔案。s可以是string型別,或者是乙個指向c風格字串的指標

fstream fstrm(s,mode);

與前乙個建構函式類似,但按指定mode開啟檔案

fstrm.open(s);

開啟名為s的檔案,並將檔案與fstrm繫結

fstrm.close()

關閉與fstrm繫結的檔案,返回void

fstrm.is_open();

返回乙個bool的值,指出與fstrm關聯的檔案是否成功開啟且尚未關閉

如果提供乙個檔名,則open會自動被呼叫:

ifstream in(ifile);    //構造乙個ifstream並開啟給定檔案

ofstream out; //輸出檔案流並未關聯任何檔案

用fstream代替iostream&

在要求使用基型別物件的地方,我們可以用繼承型別的物件來代替。所以,接受乙個iostream型別引用(或指標)引數的函式,可以用乙個對應的fstream(或sstream)型別來呼叫:

ifstream input(argv[1]);

ofstream output(argv[2]);

sales_data total;

if(read(input,total));

string line,word;

vectorpeople;

while(getline(cin,line))

當我們逐步構造輸出,希望最後一起列印時,ostringstream是很有用的:

for(const auto &entry:people)else

formatted<<" "<}

if(badnums.str().empty())

os<

cerr<<"input error"<<<" invalid number(s) "<}

C primer 學習筆記(第八章)

c 使用標準庫類處理輸入和輸出 所有這些類都是通過繼承相互關聯的。輸入類繼承了istream,輸出類繼承了ostream。因此,可在istream物件上執行的操作同樣適用於ifstream或istringstream物件。而繼承ostream的輸出類也是類似的。所有io物件都有一組條件狀態,用來指示...

C Primer 學習筆記 第八章 IO庫

io類 到目前為止,我們已經使用過的io型別和物件都是操縱char資料的。預設情況下,這些物件都是關聯使用者的控制台視窗的。當然,我們不能限制實際應用程式僅從控制台視窗進行io操作,應用程式常常需要讀寫命名檔案。而且,使用io操作處理string 中的字元會很方便。此外,應用程式還可能讀寫需要寬字元...

C Primer 筆記 第八章 IO庫

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