Печать в одной строке с паузой в C - PullRequest
6 голосов
/ 15 апреля 2011

Я хочу заставить мою программу что-то напечатать, затем подождать несколько секунд и затем напечатать что-нибудь еще в той же строке. Я пытался написать это как:

printf ("bla bla bla");
sleep (2);
printf ("yada yada yada\n");

но в выходных данных я жду 2 секунды, а затем печатаю всю строку как одну. Когда я пытался поместить вывод в разные строки, он печатал с паузой.

Как заставить его печатать с паузой в той же строке?

* Работа в Linux

Ответы [ 2 ]

17 голосов
/ 15 апреля 2011
printf ("bla bla bla");
fflush(stdout);
sleep (2);
printf ("yada yada yada\n");

fflush принудительно выводит внутренний буфер stdout на экран.

3 голосов
/ 15 апреля 2011

stdout является потоком с линейной буферизацией по умолчанию, это означает, что вам необходимо явно очистить его. Это неявно сбрасывается на новую строку. Такое поведение предписано стандартом C99.

Это означает, что в вашем первом printf текст добавляется во внутренний буфер. Это сделано для повышения эффективности, например, при печати большого количества небольших текстовых фрагментов.

Ваш второй printf содержит символ новой строки, и это приводит к сбросу потока. Вы можете явно сбросить stdout через fflush(stdout);, если хотите.

В качестве альтернативы вы также можете использовать небуферизованный stderr, как в fprintf(stderr, "bla bla bla");, но, как следует из его названия, он предназначен для ошибок и предупреждений.

См. Также вопрос SO Почему printf не сбрасывается после вызова, если в строке форматирования нет новой строки? .

...