почему printf нормально выводит без fflush - PullRequest
1 голос
/ 11 июля 2020

Я узнал, что stdout буферизируется по строке, и буфер автоматически сбрасывается при нескольких обстоятельствах (1) когда буфер заполнен, (2) когда печатается символ \ n и вывод идет на "терминал" (например, не перенаправляется в файл), (3) при выходе из программы и (4), когда программа ожидает ввода. но когда я использую printf без \ n, без fflu sh через некоторое время l oop, он выводится нормально на каждой итерации, могу ли я неправильно понять, как работают printf или fflu sh? код был скомпилирован и запущен на windows, я пробовал тот же код на машине ubuntu, он работает нормально, так это проблема с терминалом на windows?

int main(){
    int a=10;  
    while(a--){
        printf("hello world");
        sleep(1);
    }
    return 0;
}

1 Ответ

0 голосов
/ 12 июля 2020

Согласно Posix, в C stdout может буферизоваться по строке и зависеть от описанной вами задержки в худшем случае. Это не обязательно.

Многие языки программирования имеют функцию, называемую 'printf'; о чем вы говорите? Похоже на C из вашего примера.

Я только что посмотрел исходный код printf для библиотеки времени выполнения C для некоторой версии Visual Studio 2011-i sh (последняя, ​​которая у меня оказалась под рукой), и основанная на очень беглом просмотре код (он довольно сложен со всеми его условностями препроцессора), я бы сказал, что он буферизуется во время выполнения, а затем очищает буфер в конце вызова как для stdout, так и для stderr.

Если вы хотите написать переносимый код, вы не должны предполагать вышеуказанное. Чтобы данные, записанные в стандартный вывод (без символа конца строки), стали видимыми, вы должны явно flu sh.

...