Функции, которые устанавливают состояние ошибки FILE
(как сообщается ferror
), не очищают его, даже если впоследствии он успешно вызывается. Аналогично, если во время чтения вы столкнетесь с концом файла, он не будет очищен автоматически, даже если в файле позже будет доступно больше данных.
В основном это означает, что , если вы используете ferror
для проверки состояния ошибки и у вас есть какой-то способ восстановления после него, ferror
будет продолжать отображать ошибку до тех пор, пока вы не используете clearerr
.
В вашем примере, если вы просто используете возвращаемое значение fread
в качестве условия для прекращения чтения (т. Е. EOF и любой тип ошибки считаются окончательными), нет необходимости clearerr
: просто упасть до fclose
(и, возможно, используйте ferror
, чтобы определить, печатать ли сообщение об ошибке).
С другой стороны, если FILE
на самом деле является потоком, для которого позднее чтение может быть успешно выполнено, и вы обнаруживаете (или предполагаете) это конкретное условие и повторите попытку, вы должны clearerr
перед повторной попыткой, или вы будете продолжать видеть старое состояние ошибки при последующих попытках.
Аналогично, как указано в комментариях, clearerr
также очищает состояние конца файла, поэтому это также применяется при использовании feof
для проверки конца файла. (Однако обратите внимание, что обычно не следует использовать !feof(file)
в качестве условия цикла при чтении.)