2014-03-05 14 views
0

我試圖打開一個文件進行重寫。然後關閉文件,然後重新打開它進行讀取以驗證它是否寫入OK。這確實是應該的。但是,在我拔下單元(ARM)並重新插入之後,我發現文件變空了。我也嘗試手動複製文件(使用cp),並重現相同的現象。 這裏是一些代碼:重啓後的ARM Linux文件empy

string fileName = "/home/root/LogiTrackV2/InitialSetup.xml";     
ofstream theFile (fileName.c_str()); 
if (theFile.is_open()) 
{ 

    theFile.close(); 
} 

theFile.open(fileName.c_str(), ios::out | ios::trunc); 

theFile << xmlOUT.c_str(); 
theFile.close(); 

正如我在此之後提到的文件存在,更新,因爲它應該。問題是當我拔下設備...

任何想法?

謝謝!

+1

您確定該文件實際上已刷新到永久內存?試試'fsync'或'sync'。 – filmor

+0

您使用哪種ARM電路板?你知道你是否使用RAMFS? – VivienG

+0

如果您使用的是ram文件系統,mount可能會提供線索 – Simson

回答

2

這個問題比我在C++中想象的要複雜得多。標準庫中沒有辦法強制在ofstream上調用POSIX fsync。但是,您可以使用帶有file_descriptor_sinkhttp://www.boost.org/doc/libs/1_55_0/libs/iostreams/doc/classes/file_descriptor.html)的Boost.Iostreams,並在提供的fd上執行fsync以強制Linux將文件寫入磁盤。

+0

fsync確實完成了這項工作。由於它不適用於ofstream,我修改了代碼以使用文件描述符(open(...))。爲了知識的緣故,爲什麼當我不使用fsync時,有時候我的代碼工作,有些時候我的代碼沒有工作?謝謝! – user1997268

+1

這取決於Linux的IO調度。一個簡單的調度程序可能會例如每15秒刷新一次磁盤或寫入緩衝區溢出。文件數據將保留在RAM中,直到下一個寫週期(即使你在C++端「刷新」它),並且將從那裏讀取。如果在寫入數據之前斷開電源,則會丟失數據。 – filmor