我试图找出ofstream::close()
失败的原因,并遇到了一些我不理解的行为。
我使用std::ofstream
和std::copy()
将数据写入流,然后使用close()
写入文件。如果我引发错误(例如文件系统已满),则failbit
由close()
设置,但我想获得更详细的错误描述。
到目前为止,我认为如果系统调用失败,就始终设置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/