【问题标题】:Getting better error messages for iostreams为 iostream 获取更好的错误消息
【发布时间】:2011-05-19 22:26:46
【问题描述】:

我实现了一个小程序,可以提取(并通过 fuse mount)某种存档格式。我使用boost::filesystem::ifstream,但出现错误(例如,用户想要提取的文件不存在)我收到非常难以描述的错误消息。我想知道有没有办法为 C++ 中的 IO 相关问题获取更好的错误消息?

在相关的注释中,我想知道我是否应该使用 C 的 FILE* 或者在 fuse 文件系统的情况下只使用普通文件描述符?因为strerror(errno) 比 iostreams 给我的要好得多。

【问题讨论】:

  • 你的意思是std::ifstream 吗? AFAIK,没有boost::filesystem::ifstream...
  • @Thanatos :Boost.Filesystem v2 没有,但 v3 有。请参阅相关文档here

标签: c++ boost iostream boost-filesystem


【解决方案1】:

我们找不到比使用 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

【讨论】:

  • 嗯,这包含了很棒的 iostream 实现,但我不确定它是否会过度膨胀。此外,我宁愿不从另一个项目中删除一些课程并将其粘贴到我自己的项目中。维护起来简直是地狱。如果有一个不错的小 C++ IO 库(主要 Linux 发行版支持),具有良好的错误消息和高性能,我会很乐意使用它。但我不确定使用基本 C IO 是否更好。我等待更了解 FUSE 的人的回答(在 FUSE 邮件列表上发布问题)。
  • (我的意思是过度膨胀出于我的目的。)
【解决方案2】:

由于您仍然使用文件系统库,因此您可以在尝试使用流访问它之前测试file exists 是否存在。这将避免您的膨胀问题,但它不会以与您正在寻找的相同的意义运行,即流本身不会执行存在性检查。

但是,由于您使用的是boost::filesystem::ifstream,我假设您使用它是因为您使用的是boost::filesystem::path。在 boost 的ifstream 实现中,它们继承自std::basic_ifstream 并覆盖了两个函数:构造函数和open。因此,如果您想要更好的错误报告,您可以简单地做同样的事情,从 boost 的实现继承并覆盖这两个函数以提供您希望的检查。额外的臃肿:可能不会很多,它会将您希望的行为合并到流本身中。

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2018-02-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多