文件讀寫-說endl

說endl

打印語句常常在調試程序時被添加,而這類語句應當保證“一直”刷新流
———————————Stanley B.Lippman——————————

在輸出語句後添加endl成爲一種習慣,常常只是當作回車-換行符使用

然而在多次打開同一文件讀寫的時候,在流輸出語句後跟上endl,對保證文件內容順序符合預期是至關重要的


  • 看下面一段代碼:
ofstream outA;
ofstream outB;
/*以追加模式打開t.t*/
outA.open(“t.t”,ofstream::app);
outB.open(“t.t”,ofstream::app);
forint i=0;i< 3;i++{
	outA<<“pfd”;
	outB<<“PFD”;
}

兩個文件流輪番向文件t.t寫入字符串,結果文件的內容是這樣的:

PFDPFDPFDpfdpfdpfd

自成一派,有點意外,本來是輪番寫入的,結果內容卻沒有如預期"交叉".


  • 改一下代碼:
ofstream outA;
ofstream outB;
outA.open(“t.t”,ofstream::app);
outB.open(“t.t”,ofstream::app);
forint i=0;i< 3;i++{
	/*每次寫都刷新流*/
	outA<<“pfd”<<endl;
	outB<<“PFD”<<endl;
}
  • 在每一條輸出語句後面跟上endl,清空文件t.t,執行程序,再看看文件的內容:
pfd
PFD
pfd
PFD
pfd
PFD
  • 交錯分佈,符合預期

原因
看似寫入文件的數據只是緩衝區中,endl保證數據被從緩衝區刷出。
append模式要靠檢測文件末尾來保證,如果outA寫入的數據還在緩衝區中,自然文件末尾和outA執行寫操作(outA<<“pfd”)前沒有區別。

  • 所以第一類代碼的執行效果其實是outAoutB都向緩衝區寫入數據,然後把數據追加到他們打開文件時讀到的“文件末尾”。也就是說,outAoutB的讀寫沒有更新文件末尾,自然得到的文件內容就是”各成一派

而第二類代碼保證每次寫入操作都更新文件末尾,那麼自然就會得到文件內容“交錯分佈”的結果。

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