我有一个使用std::ifstream从文件加载数据的程序,并将数据存储在一个结构中。在那之后,我验证我想要的数据是否在文件中。如果不是,我要求用户修改文件并按下一个键。然后,我重新加载该文件。问题是,即使用户修改了文件,我也总是在文件中获得相同的数据,因为文件似乎被缓存在应用程序中。我已经看到在win32应用程序接口中,可以使用标志FILE_FLAG_NO_BUFFERING来避免在读取文件时使用缓冲副本,但我想在std::ifstream中使用该特性。有没有办法通过ifstream使用通过win32 api创建的句柄,或者直接在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();
}
谢谢。
编辑:当然,这是一个错误,因为我在两个非常相似的路径中有两次相同的文件。查看进程资源管理器打开的文件的句柄(而不是使我找到它的相对文件路径)。
发布于 2011-11-01 00:49:44
与其认为这是由于某种“缓冲”造成的,我会首先寻找显而易见的东西。
DataValid()
正在执行您想要的操作?操作系统使用文件缓冲区来提高磁盘性能的事实通常在应用程序级别是不可见的。只要您正在查看相同的文件,操作系统就会知道用户更新了该文件,如果您重新打开它,那么您将看到更改后的数据。如果数据从来没有机会被刷新到磁盘,这将不会影响您的应用程序。
https://stackoverflow.com/questions/7961354
复制