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

时间:2012-08-31 14:15:36

标签: c++ fstream

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

我这样做了。

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

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

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

任何人都可以告诉我为什么只使用ios::app而不使用ios::out

时我能够输出到文件

3 个答案:

答案 0 :(得分:2)

好吧,附加意味着写作,这是我能提出的最长的解释。

答案 1 :(得分:2)

使用app隐含out

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

答案 2 :(得分:0)

这个答案更具针对性,但引人注目的是: -


  

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引发的