IO类
幾種IO類型:
iostream:從流(讀或寫)數據 ?, fstream:從文件(讀或寫)數據 ,sstream:從string中(讀或寫)數據,某個流類型前面有'w'表示寬字符的版本。
?
IO類型之間的關系:
設備類型和字符大小都不會影響執行的IO操作,這是由于繼承機制的原因,fstream和sstream都繼承iostream,其中cin和cout,fstream和sstream都可以使用。
?
IO對象無拷貝或賦值:?
? ? ? ? ?ofstream out1,out1;//其中o(output)代表輸出,f代表文件(file),定義了兩個文件輸出對象
? ? ? ? ?out1=out2;//錯誤,你能對流對象賦值
? ? ? ? ?ofstream print(ofstream);//錯誤不能初始化ofsream參數
? ? ? ? ?out1=print(out1);//錯誤,不能拷貝流對象
?
條件狀態:
IO操作可以發生一些錯誤,IO類定義了一些函數和標志,可以幫助我們訪問和操作流的條件狀態。一個流一旦發生錯誤,其后續的IO操作都會失敗,所以對它的檢測是必要的。
?
#include<iostream>using namespace std;int main() {int word;while(cin>>word){cout<<word;}return word; }輸入:1b2
?
打印:1
看結果就可以知道,當流接收的b的輸入時,出錯了。word本身只接受int型, 而卻輸入了char型,則后續的IO都失敗了。所以2沒有被打印出來
?
? ? ? ?查詢流的狀態:有時候我們也需要流為什么失敗,因為對每個錯誤的原因,處理方式是不同的。
? ? ? ?strm::iostate,strm是一種IO類型,iostate是一種機器相關類型,提供了表達條件狀態的完整性
? ? ? ?strm::badbit,其表示流已崩潰
? ? ? ?strm::failbit,其用來指出一個IO操作失敗了
? ? ? ?strm::eofbit,其指出流達到了文件結束
? ? ? ?strm::goodbit,其指出流為出現錯誤狀態,此值保證為0
? ? ? badbit表示系統初級錯誤(如不可恢復的讀寫錯誤),一般badbit被置位,流就無法使用了。在發生可恢復性錯誤后,failbit被置位,這種問題通常是可以 ? ? ? ? 修正的,流還可以繼續使用。在到達文件結束位置,eofbit和failbit都會被置位。goodbit的值為0,保證未發生錯誤。如果badbit,failbit和eofbit任一個被置 ? ? ? ?位,則檢測流狀態的條件會失敗。
? ? ? ?s.eof(),a.fail(),s.bad() ,s.good()這些函數查詢這些標志位的狀態
? ? ? ?s.rdstate() ,返回流s當前的狀態,返回值類型為strm::iostate
? ? ? ?s.setstate(flags),根據給定的flags標志位,將流s中對應條件狀態位置位。flags的類型為strm::iostate。返回void
? ? ? ?
? ? ? ?
? ? ? ?管理條件狀態:
? ? ? ?流對象的rdstate成員返回一個iostate值,對應流的當前狀態。setstate操作將給定條件位置位,表示發生了對應的錯誤。
? ??
? ? ? ?管理輸出緩沖:
? ? ? 每個輸出流都管理一個緩沖區,用來保存程序讀寫的數據。有了緩沖機制,操作系統就可以將程序的多個輸出操作組合成單一的系統級寫操作,由于設備 ? ? ? ? 的寫操作耗時,這樣可以節約時間。
? ? ? 導致緩沖區刷新:
? ? ? 程序正常結束,作為main函數的return操作的一部分,緩沖刷新被執行
? ? ? 緩沖區滿時,需要刷新緩沖,而后新的數據才能繼續寫入緩沖區
? ? ?我們可以使用操作如enndl來顯示刷新緩沖區
? ? ?在每個輸出操作之后,我們可以使用操縱符unibuf設置流的內部狀態,來情況緩沖區,對cerr是設置unibuf的,因此寫到cerr的內容都是立即刷新
? ? ?一個輸出流可能被關聯到另一個流。當讀寫到關聯的流時,關聯的到流的緩沖區會被立即刷新
? ? flush,ends能像endl一樣刷新緩沖區。ends還要向緩沖區插入一個空字符,然后刷新緩沖區。
? ??
cout<<"haha"<<endl;//刷新,換換cout<<"hehe"<<flush;//刷新cout<<"hoho"<<ends;//輸出hoho再加一個空字符,刷新? ?
cout<<unibuf;//所有輸出都立即刷新緩沖區cout<<nounitbuf;//回到正常的緩沖方式? ? 如果程序出現錯誤,則輸出緩沖區不會被刷新
?
? ??
? ? ??
總結
- 上一篇: 初识标准库vector
- 下一篇: 文件输入输出和string流