18

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

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

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

4

1 回答 1

30

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

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


解释

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

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

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

然而,最后一句话似乎暗示这仅用于输出,而不用于输入。我不确定这是否是疏忽,或者是否有意。查阅您的编译器文档可能会很有用。例如,对于 gcc,输入和输出都是无缓冲的(参考GNU C++ 库手册 - 流缓冲区)。

于 2013-05-17T09:19:12.607 回答