Промывка буферов в С
Должен fflush()
не будет использоваться для очистки буфера, даже если это выходной поток?
Для чего это полезно? Как мы очищаем буфер в целом?
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()
, поэтому, если вы хотите знать истинный порядок выполнения нескольких процессов, вы должны очищать буфер после каждой печати.
Я делаю это привычкой, это избавляет меня от головной боли при отладке. Единственным недостатком, который я могу придумать, является то, что printf()
это дорогая операция (поэтому она по умолчанию не очищает буфер).
Что касается очистки входного буфера (stdin
), вы не должны этого делать. смывание stdin
является неопределенным поведением в соответствии со стандартом C11 §7.21.5.2 часть 2:
Если поток указывает на выходной поток... функция fflush заставляет любые неписанные данные для этого потока... записываться в файл; в противном случае поведение не определено.
В некоторых системах Linux, как вы можете видеть на странице руководства для fflush()
, есть определенное поведение, но оно зависит от системы, поэтому ваш код не будет переносимым.
Теперь, если вы беспокоитесь о том, что мусор "застрял" во входном буфере, вы можете использовать fpurge()
на что. Смотрите здесь для получения дополнительной информации о fflush()
а также fpurge()