C++:ios:app在fstream中不需要ios:out

C++: ios::app doesnt need ios::out in fstream

本文关键字:ios 不需要 out app C++ fstream      更新时间:2023-10-16

前几天我在文件流对象中测试中的标志

我做到了。

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

有了fstream,由于我没有使用ios::out,输出操作本不应该起作用,但它确实起作用

我注意到输出操作只适用于ios::app,但如果我使用任何其他没有ios::out的标志,它就不适用于

有人能告诉我为什么我可以在只使用ios::app而不使用ios::out 的情况下输出到文件吗

使用app表示out

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

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

这个答案更特定于编译器,但值得注意的是:-


VS 2010fstream:-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.5fstream:-再次设置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也能保持其身份。