2015-09-08 45 views
0

標題是不太清楚,但我的意思是這樣的:使用經C++修改且未關閉的文本文件是否安全?

std::fstream filestream("abc.dat", std::ios::out); 
double write_to_file; 

while (some_condition) { 

    write_to_file = 1.345; ///this number will be different in each loop iteration 
    filestream.seekg(345); 
    filestream << std::setw(5) << write_to_file << std::flush; 
    ///write the number to replace the number that is written in the previous iteration 

    system("./Some_app ./abc.dat"); ///open an application in unix, 
    ////which uses "abc.dat" as the input file 
} 
filestream.close(); 

那是粗略的想法,每次迭代重新寫號到文件和齊平。我希望不要在每次迭代中打開和關閉文件,以節省計算時間。 (也不知道打開和關閉的複雜性:/)可以這樣做嗎?

+0

./Some_app實際上也是一個讀取但不能更改文件的C++程序 –

回答

0

你至少需要調用system之前filestream.flush()沖洗C++流緩衝區(但你沒有與<< std::flush;

我假設./Someapp沒有寫入文件,並打開它僅用於閱讀。

但在你的情況下,更好地打開和關閉文件在每次迭代,因爲system電話顯然是一個巨大的瓶頸。

1

在Unix,std::flush不一定寫入到物理設備。通常情況下,它沒有。 std::ofstream::flush呼叫rdbuf->pubsync(),後者又調用rdbuf->sync(),這反過來「同步到陣列控制序列」。那些「控制序列」是什麼?通常他們不是基礎的物理設備。在像unix這樣的現代操作系統中,高級I/O結構之間有很多事情,比如C++的I/O緩衝區概念和設備上的位。

即使是低層次的POSIX功能fsync()並不一定能保證位被寫入設備。即使關閉並重新打開輸出文件也不一定能確保將位寫入設備。


你可能要重新考慮你的設計。

+0

當然,如果將這些位寫入設備,只要子進程正在從相同的位置讀取它可能沒有關係阻止緩存父進程刷新到。 – Useless

+0

在官方網站cplusplus.com它從來沒有說刷新將更新文件:( –

+0

但cplusplus.com說當做std :: stream :: close()「任何掛起的輸出序列被寫入文件」 –

相關問題