【问题标题】:C++: ios::app doesnt need ios::out in fstreamC++:ios::app 在 fstream 中不需要 ios::out
【发布时间】:2012-08-26 09:08:58
【问题描述】:

前几天我正在使用文件流对象中的标志进行测试

我做到了。

fstream binf("h.txt", ios::app);
binf << "hey";

使用 fstream,因为我没有使用ios::out,所以输出操作不应该有效,但它确实有效

我注意到输出操作仅适用于ios::app,但如果我使用任何其他标志而不使用ios::out,则它不起作用

谁能告诉我为什么我能够在只使用ios::app 而不使用ios::out 时输出到文件

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    使用app 暗示out

    标准规定appout|app结果相同,相当于"a"模式下的C fopen。

    【讨论】:

    • 是的。最终答案是:“因为标准是这样说的”。定义打开模式的表使用binaryintouttrunkapp,但单独使用时仅定义inoutapp
    【解决方案2】:

    嗯,附加意味着写作,这是我能想到的最长的解释。

    【讨论】:

      【解决方案3】:

      这个答案更特定于编译器,但令人惊讶的是:-


      VS 2010 fstream :- ios_base::out 标志已设置

      explicit basic_ofstream(const char *_Filename,
              ios_base::openmode _Mode = ios_base::out,
              int _Prot = (int)ios_base::_Openprot)
              : _Mybase(&_Filebuffer)
              {   
              if (_Filebuffer.open(_Filename, _Mode | ios_base::out, _Prot) == 0)
                  _Myios::setstate(ios_base::failbit);
              }
      

      GCC 4.5 fstream:- 再次设置 ios_base::out 标志

      explicit
            basic_ofstream(const char* __s,
                   ios_base::openmode __mode = ios_base::out|ios_base::trunc)
            : __ostream_type(), _M_filebuf()
            {
          this->init(&_M_filebuf);
          this->open(__s, __mode);
            }
      
      void
            open(const char* __s,
             ios_base::openmode __mode = ios_base::out | ios_base::trunc)
            {
          if (!_M_filebuf.open(__s, __mode | ios_base::out))
            this->setstate(ios_base::failbit);
          else
            this->clear();
            }
      

      更有趣的是,只有在ios_base::in 中,最后一位是1。这表示ios_base::in 能够保留其身份,即使在使用标志ios_base::out 时也能保持其身份。

      【讨论】:

      • 那是ofstream 添加out,就像ifstream 是添加in。普通的fstream 没有。
      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 2012-04-14
      • 2016-06-21
      相关资源
      最近更新 更多