2009-11-25 62 views
1

任何人都可以指出我的一些討論,包括打開文件進行讀寫的pro和con的討論,而不是(例如)打開文件進行讀取,關閉然後重新打開寫。我試圖尋找沒有喜悅的深入信息。打開一個文件進行讀寫的好處

非常感謝

回答

4

這取決於你在做什麼。讀取和寫入打開可能難以得到正確和一致性,因爲它非常容易意外截斷文件或無意中覆蓋部分數據。

如果讀取然後寫入(大概是一個完整的替換)實際上是一個選項,那麼兩個單獨的文件打開可能會更簡單,但考慮寫入一個新文件並重新命名,如果成功,以確保如果某件事編程錯誤!)中斷寫入舊數據不會丟失。

如果您決定打開以進行讀取/寫入,請務必仔細閱讀文檔,以便在打開時不截斷文件並注意查找和講述功能。除非以二進制模式打開,否則只能安全地通過尋找前一個指令返回的位置。

1

速度。

但這取決於你在做什麼。

如果你要寫很多小東西,最好保持開放。
如果你要寫一大塊數據,那麼每次需要時加載它(可能是更好)。

閱讀也是如此。

3

我會建議最有可能的原因是比賽條件。

假設兩個用戶將訪問同一個文件並對其進行編輯。用戶A打開文件,讀入並關閉文件。用戶B在用戶A有機會寫入之前出現,並且他還讀取該文件。

現在,如果用戶A已將文件打開,用戶B無法訪問它進行讀取。在許多情況下,這是所希望的行爲,因爲它避免了任何可能的競爭條件。在用戶A完成之前,用戶B不能訪問該文件。

另外,讓我們假設用戶A和B不會重寫文件中的任何內容,但只能附加到它,並且它們這樣做的順序並不重要(日誌記錄就是一個很好的例子)。在這種情況下,在用戶A寫入之前讓用戶B訪問文件是有意義的,因爲用戶B可能不關心用戶A當前正在做什麼。

很顯然,這兩種情況都與您想如何處理競爭條件有關,所以您應該首先考慮這個問題。通常阻止行爲會阻止競爭條件傷害你的程序,所以我會默認這種行爲,但要注意替代方法。

+1

之間切換提到沒有操作系統,所以它可能是值得一提的是, Windows默認鎖定打開的文件以防止併發訪問,但類Unix系統不會。 – SimonJ 2009-11-25 21:00:56

+0

有很多機制來支持鎖定(儘管你是對的,默認情況下不會),顯然在非鎖定的情況下,你必須使用dnotify機制(linux 2.4+)來處理競爭條件。 – tzenes 2009-11-25 21:06:55

1

由於沒有人提到過它,我會明顯地去 - 因爲你想讀取同時寫入文件。

考慮一些類似於ISAM文件的地方,您希望讀取,添加,刪除,替換各種偏移處的記錄,更新索引等。通過尋找適當的位置而無需打開和關閉文件,可以輕鬆完成更多操作!

1

需要採取如果你打開文件進行讀取和寫入的照顧另一件事是,你需要刷新你的流,同時讀取和寫入操作

相關問題