为什么ofstream::flush()返回ostream
Why does ofstream::flush() return ostream?
我想做的是:
std::ofstream outFile (fname, std::ios::binary);
//...
outFile.flush();
outFile.close();
这很好用。但是当我尝试将这两行合并时,因为flush返回了一个引用:
outFile.flush().close();
它给出错误提示:
error: ‘struct std::basic_ostream<char>’ has no member named ‘close’
然后我更仔细地查看了引用,发现它实际上返回ostream
而不是ofstream
。。
为什么会出现这种情况?它是bug还是设计的?
这是经过设计的。
ostream
是一个类,包括将序列写入相关的流缓冲区,这是一个抽象类,负责写入和读取内容。某种东西可以是任何东西;文件、控制台、插座等
ofstream
实际上只是一个方便类,它将ostream
扩展为"自动"使用一种写入文件的流缓冲区,称为filebuf
。ofstream
提供的唯一功能是open
、is_open
和close
;这些实际上只是底层CCD_ 11流缓冲区对象的文件特定功能的简单接口。
如果你真的想要,你可以创建一个ostream
,它做的事情和ofstream
完全一样。它只是需要更多的代码,而不是那么漂亮或明确。
std::filebuf f;
f.open(fname, std::ios::binary);
std::ostream os(&f);
os.write("Hello world!", 12);
os.flush();
// Error! close() isn't part of the streambuf interface, it's specific to
// files.
os.close();
基本上,ofstream
实际上不进行任何类型的编写,因此它不实现像flush
和write
这样的函数。所有的写入都是通过ostream
类完成的,该类操作底层的streambuf
类,其工作是确保数据到达其预期位置(即文件)。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- 为什么在返回 ostream 类时使用引用?
- C++ ostream 从对象数组返回数据
- 为什么ofstream::flush()返回ostream
- 我什么时候应该返回 std::ostream
- 为什么我们需要在重载>>和<<运算符时返回对 istream/ostream 的引用?
- 返回对此的引用时出现意外的std::ostream输出
- ostream 重载与 for 循环,无返回值
- 使用指针数组中的对象调用重载的友元 ostream 插入运算符将返回内存地址
- 函数中的setw返回一个ostream
- Ostream <<运算符重载及其返回类型
- std::streambuf::in_aval对于std::ostream总是返回0
- 返回ostream的函数
- C++流插入运算符的返回类型是否需要是std::ostream