Очистка буфера не работает для функции printf - PullRequest
1 голос
/ 05 апреля 2019

Исходя отсюда: https://stackoverflow.com/a/1716621/1461017

Я хочу напечатать отдельные точки (точки, "."), По одной на одной линии, под управлением цикла for:

for (i=0; i<100; i++)
{
    printf(".");
    sleep(1);
}
printf("\n");

Но результат выводится на экран только после последнего "\ n", и я хочу, чтобы каждый отображался сразу после печати, чтобы он служил индикатором прогресса. Я ожидал, что fflush() стандартный вывод на каждой итерации цикла даст такой результат, но это не работает (результаты отображаются только на экране после выполнения цикла for):

for (i=0; i<100; i++)
{
    printf(".");
    sleep(1);
    fflush(stdout);
}
printf("\n");

Более того, я проверил все эти подходы, как внутри, так и вне цикла, но безуспешно:

fflush(stdout);
fflush(NULL);
setbuf(stdout,NULL);

Что здесь происходит, и как я могу это решить?

Дополнительные данные:

  • Ubuntu Linux v16 в качестве операционной системы.
  • Код :: Блоки как IDE.
  • Проблема возникает только при работе в командной строке Bash . Работает нормально внутри IDE.
  • Протестировано на Ubuntu Linux (то же, что запускает IDE) и FreeBSD (через кросс-компиляцию с помощью clang).

1 Ответ

0 голосов
/ 06 апреля 2019

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

Проблема заключалась в следующем: при тестировании из командной строки я добавил некоторые | more, чтобы остановить сброс экрана. Таким образом, буфер stdout был изменен командой piping |.

Скажите, что бинарный файл моей программы был назван dotting. Я позвонил, набрав:

dotting | more

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

...