Подтвердить что ты не робот

Промывочные буферы в C

Должен ли fflush() использоваться для сброса буфера, даже если это выходной поток?

Для чего это полезно? Как очистить буфер в целом?

4b9b3361

Ответ 1

Я никогда не слышал, чтобы не очищать выходной буфер, и мне было бы интересно услышать ваш источник. Промывка выходных буферов:

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()