Ні, це не поведінка POSIX, це поведінка ISO (ну, це поведінка POSIX , але лише остільки , оскільки вони відповідають ISO).
Стандартний вихід - це буферний рядок, якщо його можна виявити для посилання на інтерактивний пристрій, інакше він повністю буферизований. Тож існують ситуації, коли printf
не буде спалахувати, навіть якщо надходить нова лінія для надсилання, наприклад:
myprog >myfile.txt
Це має сенс для ефективності, оскільки, якщо ви взаємодієте з користувачем, вони, ймовірно, хочуть бачити кожен рядок. Якщо ви надсилаєте вихід у файл, найімовірніше, що на іншому кінці немає користувача (хоча це не неможливо, вони можуть бути хвостиком файлу). Тепер ви можете стверджувати, що користувач хоче бачити кожного персонажа, але з цим є дві проблеми.
Перше - це не дуже ефективно. Друга полягає в тому, що початковий мандат ANSI C полягав у тому, щоб передусім кодифікувати існуючу поведінку, а не вигадувати нову поведінку, і ці проектні рішення приймалися задовго до того, як ANSI розпочав процес. Навіть ISO в даний час дуже обережно ступає при зміні існуючих правил у стандартах.
Щодо того, як з цим впоратися, якщо fflush (stdout)
після кожного вихідного дзвінка, який ви хочете побачити негайно, це вирішить проблему.
Крім того, ви можете використовувати setvbuf
перед тим, як працювати stdout
, щоб встановити його на розблоковане, і вам не доведеться турбуватися про додавання всіх цих fflush
рядків до вашого коду:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Просто майте на увазі , що може вплинути на продуктивність зовсім небагато , якщо будуть посилати висновок в файл. Також майте на увазі, що підтримка цього є визначеною реалізацією, не гарантується стандартом.
Розділ ISO C99 7.19.3/3
є відповідним бітом:
Якщо потік не буферизований , символи повинні з’являтися з джерела або в пункт призначення якнайшвидше. В іншому випадку символи можуть накопичуватися і передаватися в хост-середовище або з нього як блок.
Коли потік повністю буферизований , символи призначені для передачі в середовище хосту або з нього як блок при заповненні буфера.
Коли потік є буферним рядком , символи призначені для передачі в середовище хосту або з нього як блок, коли зустрічається символ нового рядка.
Крім того, символи призначені для передачі у вигляді блоку в середовище хоста, коли буфер заповнений, коли запит вводиться в небуферизований потік або коли запит вводиться в потоковий буферний потік, який вимагає передачі символів з хост-середовища .
Підтримка цих характеристик визначена реалізацією, і на них може впливати функція setbuf
та setvbuf
.