c++ ofstream: evaluate close() error

c++ ofstream: evaluate close() error

本文关键字:error close evaluate ofstream c++      更新时间:2023-10-16

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

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

到目前为止,我认为如果系统调用失败,errno总是设置的。然而,errno显示Success,如果我在close()失败后立即检查。

我确信当close()处理流时使用了系统调用,因为它会将文件写入文件系统,但是errno怎么可能不告诉任何有关问题的信息?所以:

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

如果在std::copy()之后显式调用flush(),则errno设置正确

No space left on device

,设置failbit。随后对close()的调用也设置failbit。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函数代替。

相关文章: