将setvbuf()与STDIN流一起使用

Nat*_*ate 4 c stdin stream

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

我确实在这里找到了推荐使用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 );
} 
Run Code Online (Sandbox Code Playgroud)

有人成功增加了此输入缓冲区吗?

我的环境:带有build-essential软件包的Ubuntu 10.10

谢谢!

Jer*_*fin 5

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

setvbuf(stdin, NULL, _IOFBF, 16384);
Run Code Online (Sandbox Code Playgroud)

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

char mybuffer[32768];

setvbuf(stdin, mybuffer, _IOFBF, sizeof(mybuffer));
Run Code Online (Sandbox Code Playgroud)

  • @Nate:猜测,这无关紧要。听起来您好像遇到了终端窗口的行编辑器中内置的缓冲区限制。setvbuf仅更改内置于标准库中的缓冲区。当您从终端读取数据时,会将其从终端的4096字节缓冲区复制到您指定的缓冲区中-但是更改库中的那个不会影响终端中内置的内容。您可能可以更改终端的缓冲区大小,但是如果是这样,则可能使用类似ioctl的东西。 (2认同)