在C中,我可以轻松地将流设置为无缓冲的I / O:
FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );
如何使用C ++ IOStream实现类似的无缓冲I / O?
答案 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)。