使用std :: ifstream而不是文件缓存强制读取磁盘

时间:2011-11-01 00:43:56

标签: c++ windows caching std ifstream

我有一个程序使用std :: ifstream从文件加载数据并将数据存储在结构中。之后,我验证我想要的数据是否在文件中。如果不是,我要求用户修改文件并按一个键。然后我重新加载文件。问题是,即使用户修改了文件,我总是在文件中获得相同的数据,因为该文件似乎是应用程序中的缓存。我在win32 API中看到过,可以使用标志FILE_FLAG_NO_BUFFERING来避免在读取文件时使用缓冲副本,但我想将该功能与std :: ifstream一起使用。有没有办法使用win32 api创建的句柄与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();
}

感谢。

编辑:当然,这是一个错误,因为我在两个非常相似的路径中有两次相同的文件。查看使用进程资源管理器打开的文件的句柄(而不是相关的文件路径让我找到它)。

1 个答案:

答案 0 :(得分:2)

我不会认为这是由某种“缓冲”引起的,而是先寻找明显的事情。

  • 您确定用户正在更改您正在阅读的同一文件吗?
  • 您确定重新加载数据是否正确更新了内存中的数据结构?
  • 你有信心DataValid()做你想做的事吗?

操作系统使用文件缓冲区来提高磁盘性能这一事实通常在应用程序级别不可见。只要您查看同一个文件,操作系统就知道用户更新了文件,如果您重新打开它,那么您将看到更改的数据。如果数据甚至没有机会刷新到磁盘,那么这不会影响您的应用程序。