fprintf()
и т. Д. Уже буферизованы. Так что это автоматически сэкономит немного дискового времени для вас. Если вы настаиваете на дальнейшей буферизации, используйте setvbuf()
с _IOFBF
, чтобы поток, на который вы пишете, был полностью буферизован.
Обратите внимание, что stdout
является буферизованной строкой, а stderr
не буферизованной. Выберите параметры для setvbuf
соответственно!
РЕДАКТИРОВАТЬ Как многие отмечали в комментариях к вопросу, имеет смысл иметь его без буферизации только тогда, когда поток имеет значение stdout
или stdin
Но когда поток является файлом отладки ( который вы анализируете после выхода из программы), и ваша программа ведет интенсивную регистрацию и работает в течение длительного времени, тогда имеет смысл буферизовать потоки.
Вот пример, который иллюстрирует использование блочных записей. Обычно все файлы имеют блочную буферизацию. Теперь я переопределю это поведение и сделаю его небуферизованным, используя setvbuf
, и посмотрим, сколько будет разница во времени
#include<stdio.h>
int main()
{
FILE *fp = fopen ("new.txt","w+");
int i =0;
/* Comment the below line to make fp buffered */
i=setvbuf(fp, (char*) NULL,_IONBF, 0);
if ( i )
{
printf("Error in setvbuf\n");
}
for ( long int i=1000000; i>0; i-- )
{
fprintf(fp,"Hello %ld\n",i );
}
fclose(fp);
return 0;
}
С буферизацией (то есть, комментируя строку setvbuf
), следующий вывод команды
time ./a.out
real 0m0.224s
user 0m0.192s
sys 0m0.020s
и без буферизации (т.е. включение setvbuf
)
time ./a.out
real 0m4.479s
user 0m0.752s
sys 0m3.708s
Мы видим огромную разницу в 4,2 с !!
Надеюсь, это поможет кому-то попытаться узнать о буферизации и ведении журнала.