在写内容到一个流时,必须要刷新缓冲区后内容才会写到流内,或者当流关闭(打开流的进程结束也叫流关闭,当然,如果进程非正常结束那么情况未定义)才会刷新缓冲区写入流,这种特性如果不注意就会产生一个很不明显的错误。
比如,有一个程序要求不断循环写入一个Log文件,这时可以这样做:
ofstream fout;
fout.open("XXX.XXX",ios::app);
while(1)
{
fout<<"XXXXXXXXXXXX\n";
}
这时如果程序不结束,即循环一直进行,那么会看到文件中并没有内容输出,就会造成错觉觉得流没有操作正确,其实内容已经写至流缓冲区,只是还没有刷新,所以就没有写入到文件。只要把循环内容改成:
fout<<"XXXXXXXXXXXX"<<endl;
就可以看到有内容输出。
是个很小的细节,但不注意就会调试很久找不到原因。被这个问题纠结了好一会,特此记录一下。