【问题标题】:Can I ask an iostream if it is writeable?我可以问一个 iostream 是否可写吗?
【发布时间】:2011-08-16 11:54:12
【问题描述】:

在我的代码中,我传递了一个对 iostream 的引用,在这种情况下,它最终是一个文件。
有什么方法可以查明,当它被打开时,它是否被设置为 [in|out] 而不仅仅是 [in]?

【问题讨论】:

  • 它真的是iostream &吗?如果是这样,它继承自istreamostream,因此是可写的。如果您要引用基类 ios,那么您正在考虑使用 RTTI 或模板函数。
  • std::fstream f("/work/file.txt", std::ios_base::in); - f 继承 ostream 但不可写。
  • 但是你为什么要这样做,除非惹恼那些想知道他们是否可以写入文件的人?

标签: c++ iostream


【解决方案1】:

查看了 IOS、iostream、ostream 的所有成员后,我没有看到任何方法可以检索使用的 openmode 标志。我想您将不得不尝试为您的参考写一些东西并捕获它抛出的任何错误。或者根据设置方式,检查 bad() 的结果。

【讨论】:

    【解决方案2】:

    openmode 被传递给std::streambuf,但没有方法可以检索它。知道文件是否为写入操作打开的唯一方法是尝试写入并检查f.fail(),或者可选的f.bad()(相当于f.rdstate() & std::fstream::badbit)。

    【讨论】:

      【解决方案3】:

      ...一种

      if ( dynamic_cast<ostream*>( MyStreamPtr ) == 0 )
      {
          // Not for output...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多