2013-06-21 79 views
0

基本上我有以下工作流程(通過控制檯應用程序):在std :: ofstream被銷燬後文件是否準備好立即讀取?

  • 讀取二進制文件(std::ifstream::read
  • 做一些與數據讀取
  • 寫回同一個文件(std::ofstream::write),覆蓋什麼 在那裏之前。

現在,如果我通過shell腳本運行這個整個控制檯程序1000次(總是使用相同的文件),是否安全地假設讀操作不會與以前運行的程序試圖寫入文件衝突?或者我需要等待處決(多久???)?我能否可靠地確定文件是否準備好?

我知道這不是最好的設計,只是想知道它是否可以可靠工作(試圖快速收集一些統計信息 - 輸入是不同的,但輸出文件總是相同的 - 需要閱讀,信息需要處理,那麼它需要更新(在這一點上只是覆蓋它))。

編輯:

它看起來像輸出是錯誤的基礎上的答案是不相關的操作系統問題,讀/寫我的樣子:

//read 
    std::ifstream input(fname,std::ios_base::binary); 
    while(input) 
    { 
     unsigned value; 
     input.read(reinterpret_cast<char*>(&value),sizeof(unsigned)); 
     .... 
    } 
    input.close(); 
... 

//write 
    std::ofstream output(fname,std::ios_base::binary); 
    for(std::map<unsigned,unsigned>::const_iterator iter =originalMap.begin();iter != originalMap.end();++iter) 
    { 
     unsigned temp = iter->first; 
     output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned)); 
     temp = iter->second; 
     output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned)); 
    } 
+0

程序實例是同時運行還是按順序運行? –

+0

@Matteo Italia - 它們按順序運行,實際上,shell腳本在循環中運行相同的控制檯應用程序... –

回答

3

他們正在運行順序,從本質上講,shell腳本運行相同的控制檯應用程序在一個循環...

那麼,任何「正常」的操作系統上,應該沒有問題。

當應用程序終止的流被破壞,因此,所有可以由C被保持在緩存中的數據C++流被寫入到底層操作系統流/,是然後關閉。

無論操作系統做一些更多的緩存是無關緊要 - 緩存由操作系統做的是對應用程序透明,所以,就應用而言,該數據現在會被寫入到文件中。如果它真的寫在磁盤上,這裏就不用擔心了 - 從文件讀取的應用程序無論如何都會看到數據。

如果你仔細想想,沒有這樣的保證,在計算機上可靠地做任何工作將會變得很複雜! :)


更新:

std::ofstream output(fname,std::ios_base::binary); 

你應該寫上,否則之前截斷輸出文件,如果輸入文件比輸出時間越長,舊的數據仍然會徘徊在文件末尾:

std::ofstream output(fname,std::ios_base::binary | std::ios_base::trunc); 
+0

問題是,我沒有得到正確的輸出 - 最後文件有一些沒有意義的數據。 –

+0

@IlyaKobelevskiy:那麼你的代碼中可能還有其他一些問題。你在寫文件之前是否截斷了這個文件?如果沒有(=你剛剛開始搜索,然後寫入''),那麼最後的數據可能是輸入文件的一個殘差。 –

+0

請參閱編輯 - 我根據輸入更新了問題 –

0

的檢查參數fstream ctor。有些實現具有擴展功能,可以方便地設置設置共享模式。

如果你問獨佔讀或寫,這就是你所得到的,只要你保持流開 - 其他類似操作也不能由不同的進程或不同流實例相同的情況發生。

純粹的標準,它需要更多的啤酒花,可能設置它們在filebuf中,並取代股票之一。照顧它。

使用共享模式是捍衛文件一致性的主流方式,所以我建議在任何情況下都使用它。

當然,如果你確保競爭情況的處理,一個進程將無法打開該文件之前,其他關閉了它,結果是好事,太。

+0

問題是我從不同的進程中讀取它(之前寫入到它的控制檯應用程序已退出) ...所以,我知道寫入流被破壞了,但是,這是否意味着我可以立即從磁盤讀取? –

+0

在閱讀器部分使用read + deny_write,如果可以打開文件內容,那麼肯定是最終的。作者最好用write + deny_all來創建新的邪惡。在讓讀者只打開現有的文件,然後都是花花公子。 –

+0

標準'fstream'構造函數只有兩個參數... –

相關問題