C++學習筆記-IO類

IO對象無拷貝和賦值,因此只能把IO類的引用作爲形參或返回值類型。又因爲讀寫IO對象會改變其狀態,因此傳遞和返回的引用不能是const的。

流的條件狀態

系統級錯誤:badbit

可恢復錯誤:failbit

到達文件結束:eofbit  當eofbit被置位的時候,failbit也會被置位

流未發生錯誤:goodbit

流的狀態檢測

流可能處於錯誤狀態,一旦發生錯誤,其上後續的IO操作都會失敗。因此,代碼通常應該在使用一個流之前檢查它是否處於良好狀態。簡單的辦法是把它當成一個條件使用

char word;

while(cin>>word){}

由於badbit被置位時IO對象的fail函數會返回true,而eofbit被置位的時候,failbit也會被置位。所以,無論badbit,failbit和eofbit
中的哪一種被置位,IO對象的fail函數會返回true。當這三種都沒被置位時,IO對象的good函數纔會返回true。

因此 ,用good和fail就能確定流的總體狀態是有效還是無效。eof和bad能表示特定的錯誤。

刷新輸出緩衝區

endl:輸出對象和一個換行符,然後刷新緩衝區

flush:輸出對象,然後刷新緩衝區

ends:輸出對象和一個空字符,然後刷新緩衝區;

unitbuf:使用cout<<unitbuf後,所有輸出操作後都會立即刷新緩衝區。直到遇到cout<<nounitbuf纔會回到正常的緩衝方式

文件的輸入和輸出

頭文件fstream中定義了三種類型來支持文件和讀寫:ifstream,ofstream和fstream

可以用>>和<<來讀寫文件,用getline從ifstream對象中讀取數據。上面介紹到的條件狀態,刷新輸出緩衝區都適用於這三種類型、

文件類有構造函數,open,close和is_open成員函數。這些是文件類特有的,不能對其他IO類型調用這些操作

打開一個文件,並與文件對象關聯。有兩種方法

1.創建一個空文件流對象,隨後調用open

char *fName="hello.txt";//或者用string類型的對象 string fName="hello.txt";

ifstream in;

in.open(ifile);

2.用帶參數的構造函數,一步完成打開和綁定操作

char *fName="hello.txt";//或者用string類型的對象 string fName="hello.txt";

ifstream in(ifile);

注意open函數可能失敗。因此通常要調用open後,檢測下對象的狀態

if(in){}

close函數

1.一旦一個文件流已經打開,它就保持與對應文件的關聯。如果,要將該文件流關聯到另一個文件,必須首先關閉已經關聯的文件。這時,要調用close函數

in.close();

in.open("practice.txt");//in與另一個文件對象關聯

2.當一個文件對象被銷燬的時候,close函數被自動調用

文件模式

與ifstream關聯的文件默認以in模式打開,與ofstream關聯的文件默認以out模式打開。與fstream關聯的文件對象默認以in和out打開

以out模式打開文件會丟棄已有數據。爲保留文件內容,必須顯式指定app模式

ofstream out("hello.txt",ofstream::app)  //app模式下,文件也總以輸出方式打開

string流

istringstream

用途:當我們的某些工作是對整行文本進行處理,而其他一些工作是對行內的單個單詞進行處理時,通常用到istringstream.

用法:此時將istringstream與存儲行內容的string對象(可用getline將內容讀入string對象)綁定(用istringstream的構造函數),再從istringstream對象中讀數據

string s1,s2;

getline(cin,s1);

istringstream istr(s1);

istr>>s2;

...

ostringstream

用途:當我們逐步構造輸出(多個字符串連接到一起),希望最後一起打印時,ostringstream是很有用的。

用法:

string s="beijing";

ostringstream ostr;

ostr<<"hello,"<<s;

cout<<ostr.str()<<endl;  //ostringstream.str()返回ostringstream對象所保存的string對象的拷貝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章