Нет, это не поведение 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
.