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

6
我正在尝试做以下事情:
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

为什么会这样?这是一个错误还是设计如此?


2
因为这里的flush是从ostream继承的成员函数,而ofstream没有实现自己的flush。然而,我认为返回一个ofstream是更好的选择。 - starrify
2
如果你正在关闭,就不需要刷新。这是关闭操作所包含的一部分。 - KitsuneYMG
2
除了在关闭之前不刷新之外,您还可以考虑不显式关闭 ofstream。至少如果作用域在那里结束,就不会有任何区别(除非您想使用不同的文件重用相同的 ofstream 对象)。 - stefan
1
@stefan认为隐式关闭作用域是正确的,变量应该在最小的作用域中定义,并让析构函数完成工作 :) - nevelis
1个回答

6

这是有意设计的。

ostream是一个抽象类,用于将序列写入相关的流缓冲区,该缓冲区是负责读写某些东西的抽象类。那个"某些东西"可以是任何东西:文件、控制台、套接字等等。

ofstream实际上只是一个方便类,扩展了ostream并'自动'使用一种写入文件的流缓冲类型,称为filebufofstream提供的唯一函数是openis_openclose;这些其实只是一个易于使用底层的filebuf流缓冲对象提供的特定于文件的功能的界面。

如果您真的想要,您可以创建一个ostream,它做的事情与ofstream完全相同。只需要更多的代码,也不如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 类,其工作是确保数据到达其预定位置(即文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接