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對象的拷貝