如何在流上禁用缓冲?

Dev*_*lar 17 c++ buffer iostream

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

FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );
Run Code Online (Sandbox Code Playgroud)

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

San*_*ker 26

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

std::ifstream f;
f.rdbuf()->pubsetbuf(0, 0);
f.open("test");
Run Code Online (Sandbox Code Playgroud)


说明

C++标准说明以下关于文件流的影响setbuf(以及因此pubsetbuf):

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

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

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

  • 挑剔:`putsetbuf` 调用 [`setbuf`](http://en.cppreference.com/w/cpp/io/basic_filebuf/setbuf),其确切行为取决于实现。根据链接的文档,一些编译器(即 GCC)要求在打开文件之前*调用它。+1无论如何找到这个。:) (2认同)
  • ......无论如何,在任何实际的I/O发生之前.我冒昧地回答"GCC安全".谢谢你的发现! (2认同)
  • @syam:`setbuf(0,0)`的行为不是实现定义的; 对于其他论点. (2认同)