說endl
打印語句常常在調試程序時被添加,而這類語句應當保證“一直”刷新流
———————————Stanley B.Lippman——————————
在輸出語句後添加endl成爲一種習慣,常常只是當作回車-換行符使用
然而在多次打開同一文件讀寫的時候,在流輸出語句後跟上endl,對保證文件內容順序符合預期是至關重要的。
- 看下面一段代碼:
ofstream outA;
ofstream outB;
/*以追加模式打開t.t*/
outA.open(“t.t”,ofstream::app);
outB.open(“t.t”,ofstream::app);
for(int 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);
for(int 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”)前沒有區別。
- 所以第一類代碼的執行效果其實是outA和outB都向緩衝區寫入數據,然後把數據追加到他們打開文件時讀到的“文件末尾”。也就是說,outA和outB的讀寫沒有更新文件末尾,自然得到的文件內容就是”各成一派“
而第二類代碼保證每次寫入操作都更新文件末尾,那麼自然就會得到文件內容“交錯分佈”的結果。