我实现了一个小程序,可以提取(并通过 fuse mount)某种存档格式。我使用boost::filesystem::ifstream
,但在出错时(例如,用户想要提取的文件不存在)我收到非常难以描述的错误消息。我想知道有没有办法为 C++ 中的 IO 相关问题获得更好的错误消息?
在相关的说明中,我想知道我是否应该使用 C 语言FILE*
,或者在 fuse 文件系统的情况下只使用普通文件描述符?因为strerror(errno)
比 iostreams 给我的要好得多。
我实现了一个小程序,可以提取(并通过 fuse mount)某种存档格式。我使用boost::filesystem::ifstream
,但在出错时(例如,用户想要提取的文件不存在)我收到非常难以描述的错误消息。我想知道有没有办法为 C++ 中的 IO 相关问题获得更好的错误消息?
在相关的说明中,我想知道我是否应该使用 C 语言FILE*
,或者在 fuse 文件系统的情况下只使用普通文件描述符?因为strerror(errno)
比 iostreams 给我的要好得多。
我们找不到比使用 boost::iostreams 和实现我们自己的基于文件的接收器和源更好的方法了。
如果需要,可以在此处获取源代码(Apache 许可):
http://sourceforge.net/projects/cgatools/files/1.3.0/cgatools-1.3.0.9-source.tar.gz/download
相关文件是:
cgatools/util/Streams.[ch]pp
由于您仍然使用文件系统库,因此您可以在尝试使用流访问文件之前测试该文件是否存在。这将避免您的臃肿问题,但它不会以与您正在寻找的相同的意义运行,即流本身不会执行存在性检查。
但是,由于您正在使用boost::filesystem::ifstream
,我假设您正在使用它,因为您正在使用boost::filesystem::path
. 在 boost 的实现中ifstream
,它们继承std::basic_ifstream
并覆盖了两个函数:构造函数和open
. 因此,如果您想要更好的错误报告,您可以简单地做同样的事情,从 boost 的实现继承并覆盖这两个函数以提供您希望的检查。额外的臃肿:可能不是很多,并且它将您希望的行为合并到流本身中。