文件准备好在std :: ofstream被销毁后立即读取吗?

时间:2013-06-21 15:09:50

标签: c++ std fstream ifstream ofstream

基本上我有以下工作流程(通过控制台应用程序):

  • 读取二进制文件(std::ifstream::read
  • 执行数据读取
  • 回写同一个文件(std::ofstream::write),覆盖什么 以前在那里。

现在,如果我通过shell脚本运行整个控制台程序1000次(总是使用相同的文件),是否可以安全地假设读取操作不会与先前运行的程序试图写入文件冲突?或者我需要在执行之间等待(多长时间???)?我能否可靠地确定文件是否准备就绪?

我知道它不是最好的设计,只是想知道它是否可靠地工作(尝试快速收集一些统计信息 - 输入不同,但输出文件总是相同的 - 需要读取,需要处理信息,然后需要更新(此时只是覆盖它))。

修改

看起来输出错误的问题与基于答案的操作系统无关,读/写我看起来像:

//read
    std::ifstream input(fname,std::ios_base::binary);
    while(input)
    {
        unsigned value;
        input.read(reinterpret_cast<char*>(&value),sizeof(unsigned));
        ....
    }
    input.close();
...

//write
    std::ofstream output(fname,std::ios_base::binary);
    for(std::map<unsigned,unsigned>::const_iterator iter =originalMap.begin();iter != originalMap.end();++iter)
    {
        unsigned temp = iter->first;
        output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned));
        temp = iter->second;
        output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned));
    }

2 个答案:

答案 0 :(得分:4)

  

它们按顺序运行,本质上,shell脚本在循环中运行相同的控制台应用程序...

然后,在任何“正常”操作系统上,应该没有问题。

当应用程序终止时,流被销毁,因此C / C ++流可能保存在缓存中的所有数据都写入底层操作系统流中,然后关闭。

操作系统是否进行更多缓存是无关紧要的 - 操作系统完成的缓存对应用程序是透明的,因此,就应用程序而言,数据现在写入文件中。如果它实际上是在磁盘上写的,那么从文件中读取的应用程序无论如何都会看到它中的数据。

如果您考虑一下,如果没有这样的保证,在计算机上可靠地进行任何工作都会很复杂! :)


更新

std::ofstream output(fname,std::ios_base::binary);

您应该在写入之前截断输出文件,否则,如果输入文件长于输出,旧数据仍将在文件末尾延迟:

std::ofstream output(fname,std::ios_base::binary | std::ios_base::trunc);

答案 1 :(得分:0)

检查fstream ctor的参数。一些实现具有扩展,允许方便地设置集合共享模式。

如果您要求独占读取或写入,只要您保持流打开,您就会得到这些内容 - 其他类似的操作不会从不同的进程发生,也不会发生在不同的流实例上。

使用纯标准,它需要更多的跃点,可能将它们设置为filebuf并替换库存。照顾它。

使用共享模式是保护文件一致性的主流方式,因此我建议在任何情况下都使用它。

当然,如果你确保处理竞争条件,一个进程将无法在另一个进程关闭之前打开文件,结果也是如此。