如何在流上禁用缓冲?

时间:2013-05-17 09:01:38

标签: c++ buffer iostream

在C中,我可以轻松地将流设置为无缓冲的I / O:

FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );

如何使用C ++ IOStream实现类似的无缓冲I / O?

1 个答案:

答案 0 :(得分:26)

对于文件流,您可以使用pubsetbuf

std::ifstream f;
f.rdbuf()->pubsetbuf(0, 0);
f.open("test");


解释

C ++标准说明了setbuf(以及pubsetbuf)对文件流的影响:

  

如果在该流上发生任何I / O之前在流上调用setbuf(0,0),则为流   变得无缓冲。否则结果是实现定义的。 “无缓冲”意味着   pbase()pptr()始终返回null,并且应尽快显示输出到文件。

第一句保证上面的代码使流无缓冲。请注意,某些编译器(例如gcc)会在流上看到打开文件作为I / O操作,因此在打开文件之前应调用pubsetbuf(如上所述)。

然而,最后一句似乎暗示这只是输出,而不是输入。我不确定这是否是疏忽,或者是否有意。咨询编译器文档可能很有用。对于gcc例如,输入和输出都是无缓冲的(参考GNU C++ Library Manual - Stream Buffers)。