我试图找出ofstream::close()失败的原因,并遇到了一些我不理解的行为。

我使用std::ofstreamstd::copy()将数据写入流,然后使用close()写入文件。如果我引发错误(例如文件系统已满),则failbitclose()设置,但我想获得更详细的错误描述。

到目前为止,我认为如果系统调用失败,就始终设置errno。但是,如果我在errno失败后立即检查,Success会说close()

我确定在对流进行close()时会使用系统调用,因为它将把文件写入文件系统,但是errno怎么可能不告诉问题任何信息?所以:

  • ofstream::close()不使用任何系统调用吗?

  • 如果我在flush()之后显式调用std::copy(),则errno设置正确
    No space left on device
    

    并设置了failbit。随后的close()调用也设置了故障位。令人惊讶的是errno重置为success

    根据errno联机帮助页:
    errno is never set to zero by any system call or library function
    

    而且我看不到哪个其他功能可以重置errno
  • 如果成功,ofstream::close()是否会明确重置errno

  • 我找到的有关ofstream的文档没有说关于errno的内容。

    已在Linux x86 g++ 4.7.3上测试。

    最佳答案

    的确ofstream::close()进行多个系统调用。即使系统调用和C库函数未将errno设置为零,C++库也可以。 ofstream::close()的至少某些实现将errno设置为0。请参见下面的注释。

    我的建议是要注意所用物品的文档,不要作任何假设。在这种情况下,正如您所指出的,ofstream::close()的文档未提及任何有关errno的内容,因此在调用ofstream::close()之后,您不应对errno作任何假设。另一方面,诸如close(fd)之类的C函数在文档中特别提到了errno。因此,如果您确实需要errno,请改用C函数。

    关于c++ - C++ ofstream : evaluate close() error,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40422986/

    10-13 08:34