我有一個程序使用std :: ifstream從文件加載數據並將數據存儲在結構中。之後,我驗證我想要的數據是否在文件中。如果不是,我要求用戶修改文件並按下一個鍵。然後我重新加載文件。問題是,即使用戶修改了文件,我總是會在文件中獲得相同的數據,因爲該文件似乎在應用程序中緩存。我已經看到,在win32 API中,可以使用標誌FILE_FLAG_NO_BUFFERING來避免在讀取文件時使用緩衝副本,但是我希望將該功能與std :: ifstream一起使用。有沒有辦法使用通過win32 API創建的句柄與ifstream或反正強迫它直接在std :: ifstream?使用std :: ifstream而不是文件緩存強制讀取磁盤
這裏有一個 「簡化」 的代碼示例:
SomeStructure s = LoadData(fileName);
while(!DataValid(s))
s = LoadData(fileName);
SomeStructure LoadData(const std::string& fileName)
{
std::ifstream fileStream;
while(!OpenFileRead(fileName, fileStream))
{
std::cout<<"File not found, please update it";
fileStream.close();
//Wait for use input
std::string dummy;
std::getline(std::cin, dummy);
}
//... Read file, fill structure, and return
std::string line;
while(std::getline(fileStream, line) && line!="")
{
//At this point, I can see that line is wrong
StringArray namedatearray=Utils::String::Split(line, "|");
assert(namedatearray.size()==2);
//Add data to my structure (a map)
}
fileStream.close();
//return structure
}
bool OpenFileRead(const std::string& name, std::fstream& file)
{
file.open(name.c_str(), std::ios::in);
return !file.fail();
}
感謝。
編輯:當然,這是一個錯誤,因爲我有兩個相同的文件在兩個非常相似的路徑。查看用進程管理器打開的文件句柄(而不是相關的文件路徑讓我發現它)。
無緩衝IO在這裏沒有影響。您要麼有錯誤的寫入代碼,要麼有錯誤的讀取代碼。 – Joe
如果問題在應用程序中緩存,如您聲明的那樣,則無緩衝的I/O不會幫助您,因爲無緩衝的I/O意味着在內核*中不緩衝*。它對應用程序的緩存數據沒有影響。你不可能讓'ifstream'處理一個無緩衝的句柄,因爲[當你創建一個帶有約束的對象時,你必須確保每個使用該對象的人都理解這些約束](http://blogs.msdn。 COM/b/oldnewthing /存檔/ 2010/04/14/9995509.aspx)。 –
你如何修改文件?許多我們認爲「修改」文件的東西實際上並不修改文件,而是用新的修改過的文件替換文件。 –