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