Использование setvbuf () с потоком STDIN - PullRequest
3 голосов
/ 04 мая 2011

Я пишу небольшую программу на C, которая должна принимать входной поток размером более 4096 байт.

Я нашел пост, который рекомендовал использовать setvbuf () здесь:

Увеличение длительности вызовов fgets read () в linux

Мне все еще очень трудно заставить это работать - вот фрагмент моего кода, с которым я борюсь:

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 с пакетом build-essential

Спасибо!

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

Прямо сейчас вы используете _IONBF, что означает без буферизации.Использование _IOFBF вместо этого, вероятно, будет хорошим началом (это буферизация full ).Чтобы увеличить размер буфера, вы также захотите указать этот большой размер буфера в качестве четвертого параметра, например:

setvbuf(stdin, NULL, _IOFBF, 16384);

Это динамически распределяет пространство буфера.В зависимости от ситуации вы можете вместо этого передать ему буфер:

char mybuffer[32768];

setvbuf(stdin, mybuffer, _IOFBF, sizeof(mybuffer));
3 голосов
/ 04 мая 2011

Я экспериментировал с размерами буфера в прошлом и нашел небольшое преимущество в его увеличении.Если вы используете какие-либо высокоуровневые функции ввода, такие как fgets (или хуже, fgetc или fscanf), то на поиск разделителей или на вызов функции или на анализируемые служебные данные будет потрачено достаточно времени, чем число readСистемные вызовы действительно не имеют большого значения, если размер буфера составляет не менее 1 КБ или около того.Если, с другой стороны, вы читаете большие блоки за один раз (через fread), реализация должна быть достаточно умной, чтобы полностью пропустить буферизацию и читать непосредственно в буфер, предоставленный вызывающей стороной.Поэтому я обычно считаю setvbuf бесполезной, хотя, возможно, и безвредной, микрооптимизацией.

...