1、IO對象無拷貝或指派,是以不能将形參或傳回類型設定為流類型
ofstream out1, out2;
out1 = out2; //錯誤 不能對流對象指派
ofstream print(ofstream); //錯誤 不能初始化ofstream參數
out2 = print(out1); //錯誤 不能拷貝流對象
2、流的狀态
一個流一旦發生錯誤,其上後續的IO操作都會失敗,由于流可能處于錯誤狀态,是以代碼通常應該在應用之前檢查它。确定一個流對象的狀态的最簡單的方法是将他當作條件來使用:
while(cin >> word) // while循環檢查 >>表達式傳回的流的狀态
{ }
3、輸出緩沖區重新整理的時機包括但不限于以下幾種
- 程式正常結束,作為main函數return操作的一部分
- 緩沖區滿
- 使用操作符顯示重新整理,如endl(加一個換行)、ends(加一個空字元)、flush(什麼都不加)
- 使用unitbuf操作符設定流的内部狀态
- 一個輸出流可能被關聯到另一個流。當讀寫被關聯的流時,關聯到的流的緩沖區會被重新整理。例如,預設情況下,cin和cerr都關聯到cout,是以,讀cin或寫cerr都會導緻cout的緩沖區被重新整理
cout << unitbuf; //所有輸出操作後都會立即重新整理緩沖區。任何輸出立即重新整理,無緩沖
cout << nounitbuf; //重置流 回到正常的緩沖方式
要注意的是,如果程式崩潰,輸出緩沖區不會被重新整理
4、以out模式打開檔案會丢失已有資料
當以預設模式打開一個ofstream時,檔案内容會被丢棄。保留被ofstream打開的檔案中已有資料的唯一方法是顯示指定app或in模式
// 下面三條語句files1都被截斷(清空)
ofstream out("file1"); //預設out模式打開并截斷檔案
ofstream out2("file1", ofstream::out);
ofstream out2("file1", ofstream::out | ofstream::trunc);
// 下面語句會保留檔案内容
ofstream app("file2", ofstream::app);
ofstream app("file2", ofstream::out | ofstream::app);