2012-04-25 288 views
0

在運行時,我的程序會同時創建兩個大的二進制文件並將其寫入磁盤。文件A約爲240GB,文件B約爲480GB。這兩個文件由兩個ofstream對象維護,寫入操作在循環中使用成員函數write執行。在編寫大型二進制文件時,ofstream :: write在寫入中途失敗

現在的問題是:每次整個寫文件過程達到63〜64%時寫文件操作都會失敗。第一次在文件A上失敗,第二次在文件B上失敗。

在程序運行期間,我的建築物的電源正在升級。奇怪的是,每次程序失敗時,電工恰好正在切斷和恢復中央空調和一些辦公室的電源。因此,我真的懷疑寫入文件失敗是否是由不穩定的電源造成的。

我確定失敗不是由文件大小限制造成的,因爲我試圖用同樣的方法編寫一個單一的700GB文件而沒有任何問題。

有沒有辦法找出詳細的原因?我覺得ofstream的標誌(badbit,eofbitfailbit)不提供太多的信息。現在我試圖使用errnostrerror來獲取詳細的錯誤消息。然而,我看到errno的可能值是EIO,它測量了「I/O錯誤」,它再次沒有提供有用的信息。

有沒有人遇到過這種情況?

順便說一句,當文件A和文件B的大小很小時,程序運行沒有錯誤。

PS:這次程序在55%失敗,並且errno值是EINVAL:無效參數。很奇怪。

+1

你有沒有試過只寫63〜64%的文件子集? – moooeeeep 2012-04-25 11:49:59

+0

@moooeeeep:但現在剛發生的是,它只是寫出兩個文件的63〜64%的子集。我可以看到63%〜64%的子集成功寫入,因爲我看到在程序轉換時兩個文件越來越大。 – 2012-04-25 11:58:27

+0

也許是S.M.A.R.T.實用程序可以給出一些線索。 – 2012-04-25 14:14:06

回答

0

好的,我已經解決了Win32 API的問題:CreateFile和WriteFile。