Что такое хороший способ восстановления после сбоя fread ()? - PullRequest
3 голосов
/ 24 апреля 2009

Если вызов функции fread () возвращает 0, а ferror () указывает на ошибку (по сравнению с EOF), можно ли повторить попытку чтения или лучше закрыть и снова открыть файл?

Я не могу начать полностью заново - входной файл был частично обработан способом, который невозможно отменить (скажем, я записываю порцию за раз в сокет и, из-за существующего протокола, У меня нет возможности сказать удаленному концу: «Не бери в голову, мне нужно начать все сначала»).

Я мог бы fclose () и fopen () файл, fseek () после уже обработанных данных и продолжить оттуда fread (), но все ли это необходимо?

Ответы [ 3 ]

6 голосов
/ 24 апреля 2009

Вы можете взглянуть на функцию clearerr.

6 голосов
/ 24 апреля 2009

Не существует решения "один размер подходит всем", поскольку разные ошибки могут требовать различной обработки. Ошибки от fread() необычные; если вы называете это правильно, ошибка может указывать на ситуацию, которая оставила FILE* в состоянии странной ошибки. В этом случае вам лучше всего позвонить fclose(), fopen(), fseek(), чтобы вернуть вещи в хорошее состояние.

Если вы кодируете что-то, что происходит, пожалуйста, укажите фактические ошибки, которые вы получаете ferror() ...

0 голосов
/ 24 апреля 2009

Вы можете показать ошибку пользователю с помощью perror() или strerror() и спросить ее, хочет ли она повторить попытку.

Однако реализация не обязана предоставлять такое сообщение об ошибке. Вы должны установить errno в 0 до вызова fread(); если произойдет сбой и errno будет по-прежнему 0, информация об ошибке будет недоступна.

...