C++:ios:app在fstream中不需要ios:out
C++: ios::app doesnt need ios::out in fstream
前几天我在文件流对象中测试中的标志
我做到了。
fstream binf("h.txt", ios::app);
binf << "hey";
有了fstream,由于我没有使用ios::out
,输出操作本不应该起作用,但它确实起作用
我注意到输出操作只适用于ios::app
,但如果我使用任何其他没有ios::out
的标志,它就不适用于
有人能告诉我为什么我可以在只使用ios::app
而不使用ios::out
的情况下输出到文件吗
使用app
表示out
。
标准规定app
和out|app
具有相同的结果,相当于"a"
模式下的C fopen。
嗯,追加意味着写作,这是我能想到的最长的解释。
这个答案更特定于编译器,但值得注意的是:-
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
也能保持其身份。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- C++:ios:app在fstream中不需要ios:out