0

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

我做到了。

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

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

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

谁能告诉我为什么我只能在ios::app不使用的情况下输出到文件ios::out

4

3 回答 3

2

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

于 2012-08-31T14:18:22.787 回答
2

使用app暗示out

该标准规定appout|app具有相同的结果,相当于 C fopen in mode "a"

于 2012-08-31T14:21:35.637 回答
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

于 2012-08-31T15:04:55.887 回答