c ++ ofstream:评估close()错误

我试图找出一个失败的原因,streamofstream::close()并遇到一些我不明白的行为。

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

到目前为止,我认为如果系统调用失败, errno总是被设置。 但是,如果我在close()失败后立即检查, errnoSuccess

我确定在close()stream时会使用系统调用,因为它会将文件写入文件系统,但是errno怎么可能不会告诉关于这个问题的任何信息呢? 所以:

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

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

 No space left on device 

并设置failbitclose()的后续调用也会设置失败位。 令人惊讶的是, errno被重置为success

根据errno页:

 errno is never set to zero by any system call or library function 

我不知道哪个函数会重置errno

  • ofstream::close()是否显式重置errno以防成功?

我find的关于stream的文档并没有说关于errno

用Linux x86 g ++ 4.7.3testing。

事实上,ofstream :: close()会进行多个系统调用。 即使系统调用和C库函数没有将errno设置为零,C ++库也可能会这样。 至少一些ofstream :: close()的实现将errno设置为0.请参阅下面的注释。

我的建议是注意你使用的东西的文档,不要做出假设。 在这种情况下,正如你所指出的,ofstream :: close()的文档没有提及errno,所以你不应该在调用ofstream :: close()之后做任何errno的假设。 另一方面,C函数如close(fd)在文档中特别提到了errno。 所以,如果你真的需要errno,那就用C函数吧。