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

时间:2014-02-22 07:21:15

标签: c++ file ofstream

我试图这样做:

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还是设计好的?

1 个答案:

答案 0 :(得分:6)

这是设计的。

ostream是一个包含将序列写入关联的流缓冲区的类,这是一个抽象类,负责编写和读取某些东西。那可能是什么东西;文件,控制台,套接字等

ofstream实际上只是一个便利类,它将ostream扩展为“自动”使用一种写入文件的流缓冲区,称为filebufofstream提供的唯一功能是openis_openclose;这些只是基础filebuf流缓冲区对象的文件特定功能的简单接口。

如果你真的想要,你可以创建一个与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类,它的工作是确保数据到达它的预定位置(即文件)。