c++ ofstream: evaluate close() error
c++ ofstream: evaluate close() error
我试图找出ofstream::close()
失败的原因,遇到了一些我不理解的行为。
我使用std::ofstream
和std::copy()
将数据写入流,然后我使用close()
写入文件。如果我触发了一个错误(例如文件系统已满),failbit
由close()
设置,但是我想获得更详细的错误描述。
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函数代替。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 为什么我会"error: expected expression"?
- CMake Error at modules/videoio/cmake/detect_ffmpeg.cmake:16
- c++ ofstream: evaluate close() error
- Boost asio TCP IP asio class compile error with Visual Studio.错误:C2228:'.close'左侧必须具有类/结构/联合