Если возникает какая-либо ошибка, индикатор ошибки для потока будет установлен и не будет очищен до тех пор, пока не будет вызван clearerr
. Однако из-за буферизации функциям stdio сложно сообщать об ошибках. Часто ошибка не будет видна до более позднего вызова, поскольку буферизация данных никогда не завершается неудачей, но последующая запись после заполнения буфера может завершиться неудачей. Если вы используете stdio для записи файлов, единственные известные мне способы надежной обработки ошибок записи (выбрать один):
- отключить буферизацию (с помощью
setbuf
или setvbuf
- это должна быть самая первая операция, выполненная на FILE
после его открытия или в противном случае она имеет UB)
- отслеживать последний успешный
fflush
и предполагать, что любые данные после этого могут быть только частично записаны
- обрабатывает любую неудачную запись как полностью невосстановимый файл и просто удаляет ее
Также обратите внимание, что в системе POSIX fwrite
(и другие функции stdio) необходимо установить errno
, чтобы указать тип ошибки в случае возникновения ошибки. Что касается простого C, эти функции могут устанавливать errno
, а могут и не устанавливать.