Раздел 7.9.13/7
из c99
гласит:Является ли строка stdout буферной, небуферизованной или неопределенной по умолчанию?
В запуске программы, три текстовые потоки предопределены и не должны быть открыты в явном виде - стандартный ввод (для чтения обычного ввода), стандартный вывод (для записи обычного вывода) , и стандартная ошибка (для записи диагностического вывода).
Как первоначально открытый, стандартный поток ошибок не полностью буферизирован; стандартные входные и стандартные выходные потоки полностью буферизуются тогда и только тогда, когда можно определить поток, чтобы не ссылаться на интерактивное устройство.
Так что это имеет смысл. Если вы нажимаете свой стандартный вывод на файл, вы хотите, чтобы он был полностью буферизован для повышения эффективности.
Но я не могу найти упоминания в стандарте о том, является ли вывод строковым буфером или небуферированным, если вы не не может определить, что устройство не является интерактивным (то есть, нормальный выход на терминал).
Поэтому я задаю был комментарий к моему ответу here, что я должен вставить fflush(stdout);
между двумя утверждениями:
printf ("Enter number> ");
// fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
, потому что я не был прекращением printf
с новой строкой. Кто-нибудь может это понять?
Вы не можете «временно» сделать 'stdout' небуферизованным. 'setbuf' и' setvbuf' имеют неопределенное поведение, если они не являются первой операцией, выполняемой в файле после ее открытия. –
@R ..: Спасибо, вы правы. Я добавил это к ответу. – schot
В случае буферизации строк есть ли водяной знак, если линия слишком длинная, она будет размыта? – CMCDragonkai