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