繁体   English   中英

将 setvbuf() 与 STDIN stream 一起使用

[英]Using setvbuf() with STDIN stream

我正在编写一个小型 C 程序,该程序必须接受大于 4096 字节的输入 stream。

我确实在这里找到了推荐使用setvbuf()的帖子:

使 fgets 在 linux 上发出更长的 read() 调用

我仍然很难让它工作 - 这是我正在努力解决的代码:

int main(void) 
{ 
#define MAX_STRING_SIZE 7168

char input_string[MAX_STRING_SIZE];

printf( "Input: " );

setvbuf( stdin, NULL, _IONBF, 0 );

fgets( input_string, MAX_STRING_SIZE-1, stdin );

printf( "\n" );
printf( "%s", input_string );
} 

有没有人成功增加了这个输入缓冲区?

我的环境:Ubuntu 10.10 与构建必需的 package

谢谢!

现在您正在使用_IONBF ,这意味着没有缓冲。 改用_IOFBF可能是一个好的开始(即完全缓冲)。 要增加缓冲区大小,您还需要将大缓冲区大小指定为第四个参数,例如:

setvbuf(stdin, NULL, _IOFBF, 16384);

这会动态分配缓冲区空间。 根据情况,您可能希望将缓冲区传递给它:

char mybuffer[32768];

setvbuf(stdin, mybuffer, _IOFBF, sizeof(mybuffer));

我过去曾尝试过缓冲区大小,但发现增加它没有什么好处。 如果您使用任何更高级别的输入函数,如fgets (或更糟的是fgetcfscanf ),则将花费足够的时间来搜索分隔符或在 function 调用或解析开销中read系统调用的数量实际上并不重要,只要缓冲区至少为 1kb 左右。 另一方面,如果您一次读取大块(通过fread ),则实现应该足够聪明,可以完全跳过缓冲并直接读入调用者提供的缓冲区。 因此,我通常认为setvbuf是无用的,尽管可能是无害的微优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM