2013-07-15 27 views
0

C++程序P1使用ios :: app在不存在的文件上創建ofstream。然後寫入一些字符串(不包括「\ n」),但不使用endl(因此緩衝區未刷新)。然後等待2秒鐘並關閉文件。在兩個不同進程的追加模式下使用ofstream

程序P2與P1相同,只是它沒有等待。我期待P1覆蓋寫入文件的任何P2,因爲它的緩衝區在2秒後被刷新,但情況並非如此。 P2的輸出正確顯示,然後在文件中輸出P1。

經過多次這樣的實驗後,在我看來,每次寫入後(即使不使用endl),「app」模式都會刷新緩衝區。我想知道其他人是否面臨類似的情況,以及我的結論是否正確。先謝謝了。

+0

據我的描述可以看出,行爲與流緩存數據一致,如你期望的那樣,並且在刷新緩衝區之前立即尋找文件末尾。 –

+0

這超出了該語言的範圍。當我們談論刷新一個文件時,我們正在沖洗它到OS/FileSystem來處理。這些事情如何處理交互過程將取決於所使用的操作系統和文件系統。 –

回答

0

你在這裏依賴於未定義的行爲 - 沒有任何保證,如果你不使用std :: endl它不會刷新。不要依賴未定義或假定的行爲 - 只依賴明確指定的行爲。

要闡述:

1.3.24                     [defns.undefined] 
undefined behavior 
behavior for which this International Standard imposes no requirements 
[ Note: Undefined behavior may be expected when this International Standard omits any explicit definition of 
behavior or when a program uses an erroneous construct or erroneous data. Permissible undefined behavior 
ranges from ignoring the situation completely with unpredictable results, to behaving during translation or 
program execution in a documented manner characteristic of the environment (with or without the issuance of 
a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). 
Many erroneous program constructs do not engender undefined behavior; they are required to be diagnosed. 
— end note ] 

C++ 11或C++ 03規定爲user2585330是依靠行爲沒有任何要求。

+0

他如何得到未定義的行爲? – 0x499602D2

+0

他依賴於它 - std中沒有任何東西可以保證std :: filebuf將被緩衝 - 但他認爲它會是。 –

+2

@IwanAucamp:「未定義的行爲」是由語言定義的術語,在C/C++的上下文中具有特定的含義。你沒有正確使用它。 –

0

簡答:不,您不能依賴此行爲工作。

在回過頭來看類似的問題時,我寫了一些代碼來完成這件事,它確實不起作用(不一定是這些進程會覆蓋其他數據 - 我沒有看到那個特定的行爲,但那是不是我正在尋找的 - 在這種情況下的問題是,如果數據從一個進程和另一個進程保證是「完整的」 - 顯然也是您的擔心之一,即使您沒有詢問這一點) 。您將從一個進程中獲得「塊」數據,與來自另一個進程的「塊」數據混合在一起。它們究竟是如何混合在一起取決於什麼平臺,系統上的負載是什麼,一週中的哪一天(模糊的相關性,可能不是真實的)以及可能的其他因素。

從技術上講,C++標準不知道/關心多個進程,就語言而言,只有一個進程 - 想象一下,該語言在舊的DOS系統上工作,只有一個進程在任何給定的時間運行。因此,如果您有多個使用同一文件的進程,標準沒有說明會發生什麼。

相關問題