Функция Printf в C не печатает, пока цикл while не завершится

Я хочу проверить, активны ли разные циклы, поэтому у меня есть оператор печати, который повторяется каждые 500 мс в каждом цикле, однако оператор печати не печатает каждые 500 мс, он ждет завершения цикла, а затем печатает все сразу, а не периодически .

Как мне заставить мою программу периодически печатать на терминале?

Я студент, поэтому мои знания SDL довольно ограничены, поэтому подробное объяснение будет оценено.

int main(void)
{
    int i = 0;
    while(i<10)
        {
            printf("While loop active.\t"); i++;
            SDL_Delay(500);
        }
    return 0;
}

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


person Richard Robertson    schedule 17.07.2018    source источник
comment
printf вывод в C обычно буферизуется. Информация накапливается внутри до тех пор, пока выходной драйвер не решит, что пришло время действительно отправить ее. Выходной буфер не очищается до тех пор, пока (а) он не заполнится (много информации), (б) вы не напечатаете каретку/возврат/перевод строки или (в) вы не сделаете явное fflush(stdout). Почему бы не использовать \n вместо \t, тогда вы сразу увидите результат? Вывод вкладки (\t) будет немного беспорядочным. Если вам действительно необходимо иметь \t, используйте fflush(stdout) после printf.   -  person lurker    schedule 17.07.2018
comment
@lurker Большое спасибо за ваш хорошо объясненный ответ. Я никогда не понимал, для чего используется fflush или что \n сбрасывает, а \t нет, так что это чрезвычайно полезно. Спасибо еще раз.   -  person Richard Robertson    schedule 18.07.2018


Ответы (1)


Вероятно, вы не очищаете стандартный вывод. Добавьте новую строку к вызову printf, и все будет в порядке:

printf("While loop active.\n");
/* Here ------------------^ */

Или, если сохранение \t необходимо:

printf("While loop active.\t");
fflush(stdout);

Кредит @lurker для получения дополнительной информации.

person Mureinik    schedule 17.07.2018