前几天我正在使用文件流对象中的标志进行测试
我做到了。
fstream binf("h.txt", ios::app);
binf << "hey";
使用fstream,因为我没有使用ios::out
,所以输出操作不应该起作用,但它确实起作用了
我注意到输出操作ios::app
仅适用于但如果我使用任何其他标志而没有ios::out
它不起作用
谁能告诉我为什么我只能在ios::app
不使用的情况下输出到文件ios::out
好吧,附加意味着写作,这是我能想到的最长的解释。
使用app
暗示out
。
该标准规定app
和out|app
具有相同的结果,相当于 C fopen in mode "a"
。
这个答案更特定于编译器,但令人惊讶的是:-
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
。