为什么ofstream::flush()返回ostream

Why does ofstream::flush() return ostream?

本文关键字:返回 ostream flush ofstream 为什么      更新时间:2023-10-16

我想做的是:

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扩展为"自动"使用一种写入文件的流缓冲区,称为filebufofstream提供的唯一功能是openis_openclose;这些实际上只是底层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实际上不进行任何类型的编写,因此它不实现像flushwrite这样的函数。所有的写入都是通过ostream类完成的,该类操作底层的streambuf类,其工作是确保数据到达其预期位置(即文件)。