我前几天正在使用文件流对象中的标记进行测试
我这样做了。
fstream binf("h.txt", ios::app);
binf << "hey";
使用fstream,因为我没有使用ios::out
,输出操作不应该有效,但确实有效
我注意到输出操作仅适用于ios::app
,但如果我使用任何其他没有ios::out
的标记,它就不起作用
任何人都可以告诉我为什么只使用ios::app
而不使用ios::out
答案 0 :(得分:2)
好吧,附加意味着写作,这是我能提出的最长的解释。
答案 1 :(得分:2)
使用app
隐含out
。
该标准指定app
和out|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
引发的