Должен ли fflush()
использоваться для сброса буфера, даже если это выходной поток?
Для чего это полезно? Как очистить буфер в целом?
Должен ли fflush()
использоваться для сброса буфера, даже если это выходной поток?
Для чего это полезно? Как очистить буфер в целом?
Я никогда не слышал, чтобы не очищать выходной буфер, и мне было бы интересно услышать ваш источник. Промывка выходных буферов:
printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is
или
fprintf(fd, "Buffered, will be flushed");
fflush(fd); //Prints to a file
Может быть очень полезной техникой. Почему вы хотите очистить выходной буфер? Обычно, когда я это делаю, это из-за сбоя кода, и я пытаюсь что-то отлаживать. Стандартный буфер не будет печатать каждый раз, когда вы вызываете printf()
, он ждет, пока он не заполнится, а затем сбросит кучу сразу. Поэтому, если вы пытаетесь проверить, выполняете ли вы вызов функции перед сбоем, полезно printf
что-то вроде "получить здесь!", И иногда буфер не был очищен до сбоя и вы не можете сказать, насколько далеко вы действительно получили.
В другой раз это полезно, это многопроцессорный или многопоточный код. Опять же, буфер не всегда закрашивается при вызове printf()
, поэтому, если вы хотите узнать истинный порядок выполнения нескольких процессов, вы должны fflush буфер после каждой печати.
Я делаю привычку делать это, это избавляет меня от головной боли при отладке. Единственный недостаток, который я могу придумать, заключается в том, что printf()
является дорогостоящей операцией (поэтому она по умолчанию не очищает буфер).
Что касается очистки буфера ввода (stdin
), вы не должны этого делать. Промывка stdin
соответствует undefined по стандарту C11 §7.21.5.2, часть 2:
Если поток указывает на выходной поток... функция fflush заставляет любые неписанные данные для этого потока... записываться в файл; в противном случае поведение undefined.
В некоторых системах Linux является одним из тех, что вы видите на странице руководства для fflush()
, там определено поведение, но оно зависит от системы, поэтому ваш код не будет быть портативным.
Теперь, если вы беспокоитесь о том, что мусор "застрял" во входном буфере, вы можете использовать fpurge()
.
Подробнее см. здесь для fflush()
и fpurge()