fwrite помещает индикатор ошибки в поток в C - PullRequest
3 голосов
/ 22 февраля 2011

В каких случаях функция fwrite помещает в поток индикатор ошибки, так что ferror возвращает true?

В частности, мне интересно, если он выдаст ошибку, когда не все байты были успешно записаны.

Пожалуйста, укажите ссылку, откуда вы получаете информацию.

Спасибо

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Если возникает какая-либо ошибка, индикатор ошибки для потока будет установлен и не будет очищен до тех пор, пока не будет вызван clearerr. Однако из-за буферизации функциям stdio сложно сообщать об ошибках. Часто ошибка не будет видна до более позднего вызова, поскольку буферизация данных никогда не завершается неудачей, но последующая запись после заполнения буфера может завершиться неудачей. Если вы используете stdio для записи файлов, единственные известные мне способы надежной обработки ошибок записи (выбрать один):

  • отключить буферизацию (с помощью setbuf или setvbuf - это должна быть самая первая операция, выполненная на FILE после его открытия или в противном случае она имеет UB)
  • отслеживать последний успешный fflush и предполагать, что любые данные после этого могут быть только частично записаны
  • обрабатывает любую неудачную запись как полностью невосстановимый файл и просто удаляет ее

Также обратите внимание, что в системе POSIX fwrite (и другие функции stdio) необходимо установить errno, чтобы указать тип ошибки в случае возникновения ошибки. Что касается простого C, эти функции могут устанавливать errno, а могут и не устанавливать.

0 голосов
/ 22 февраля 2011

Со страницы руководства fwrite в моей системе Linux:

RETURN VALUE
   fread() and fwrite() return the number of items successfully read or written
   (i.e., not the number of characters).  If an error occurs, or the end-of-file
   is  reached, the return value is a short item count (or zero).

   fread()  does  not  distinguish between end-of-file and error, and callers
   must use feof(3) and ferror(3) to determine which occurred.

Просто после прочтения страницы руководства не похоже, что она установит errno.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...