C fputc обработка ошибок? - PullRequest
       2

C fputc обработка ошибок?

2 голосов
/ 18 сентября 2011

В большинстве примеров написания C-файлов для fputc используется очень простой пример с минимальной или отсутствующей проверкой ошибок процесса.

Какие методы и функции проверки ошибок следует использовать в сочетании с циклом fputc, чтобы убедиться, что fputc успешно записал в файл? И как мне их использовать?

Причина, по которой я специально спрашиваю fputc, заключается в том, что я работаю с двусвязным списком.

Ответы [ 2 ]

6 голосов
/ 18 сентября 2011

Проверка возвращаемого значения fputc обычно не скажет вам ничего полезного и сделает ваш код отвратительным.Причина, по которой возвращаемое значение редко имеет смысл, заключается в том, что файлы stdio буферизированы и произошла ошибка записи (обычно из-за исчерпания дискового пространства, но также из-за аппаратного сбоя, который на самом деле не может быть обработан изящно)) не будет сообщено, пока буфер не будет очищен.Из-за этого также невозможно узнать, даже когда сообщается об ошибке, сколько было успешно зафиксировано на диске.

Таким образом, я считаю, что вы должны использовать stdio только для записи файлов, когда выготов считать всю операцию «сохранения» неудачной, если во время записи возникает какая-либо ошибка.Если вы воспользуетесь этим подходом, вы можете полностью игнорировать возвращаемое значение всех функций записи.Это связано с тем, что stdio FILE сохраняет индикатор внутренней ошибки доступным как ferror(f).Так что просто делайте все ваши записи, не проверяя на наличие ошибок, затем, прежде чем закрыть файл, проверьте ferror(f).Если он возвращает ненулевое значение, вы знаете, что операция «сохранить» не удалась, и вы можете сообщить об этом пользователю и remove частично записанному файлу.Имейте в виду, что вы должны сначала записывать во временный файл, а затем rename это на место, а не писать прямо поверх старого файла, если только вы не рискуете уничтожить старые данные пользователя при сбое.

2 голосов
/ 18 сентября 2011

Вы должны проверить int возвращаемое значение от fputc(). следующий - это список :

В случае успеха fputc () возвращает значение c, которое было записано в поток.В случае ошибки он возвращает EOF и устанавливает для errno одно из следующих значений:

EACCES

Another process has the file locked. 

EBADF

stream is not a valid stream opened for writing. 

EFBIG

The file is a regular file and an attempt was made to write at or

за пределами максимума смещения.

EINTR

A signal interrupted the call. 

EIO

An output error occurred. 

ENOMEM

Memory could not be allocated for internal buffers. 

ENOSPC

An attempt is made to write to a full disk.

ENXIO

A device error occurred. 

EPIPE

An attempt is made to write to a closed pipe.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...