我试图找出一个失败的原因,streamofstream::close()
并遇到一些我不明白的行为。
我使用std::ofstream
和std::copy()
将数据写入stream,然后使用close()
写入文件。 如果我引发一个错误(例如文件系统已满),故障failbit
由close()
设置,但是我想得到更详细的错误描述。
到目前为止,我认为如果系统调用失败, errno
总是被设置。 但是,如果我在close()
失败后立即检查, errno
说Success
。
我确定在close()
stream时会使用系统调用,因为它会将文件写入文件系统,但是errno
怎么可能不会告诉关于这个问题的任何信息呢? 所以:
ofstream::close()
不使用任何系统调用吗? 如果我在std::copy()
之后显式地调用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
以防成功? 我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函数吧。