天天看點

c++Primer——第八章:IO庫

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);
           

繼續閱讀