我试图这样做:
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还是设计好的?
答案 0 :(得分:6)
这是设计的。
ostream
是一个包含将序列写入关联的流缓冲区的类,这是一个抽象类,负责编写和读取某些东西。那可能是什么东西;文件,控制台,套接字等
ofstream
实际上只是一个便利类,它将ostream
扩展为“自动”使用一种写入文件的流缓冲区,称为filebuf
。 ofstream
提供的唯一功能是open
,is_open
和close
;这些只是基础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
实际上并不进行任何类型的编写,因此它不会实现flush
和write
等函数。所有的写作都是通过ostream
类完成的,该类操作一个基础的streambuf
类,它的工作是确保数据到达它的预定位置(即文件)。