у fread и fwrite есть сбой? как справиться с этим? - PullRequest
11 голосов
/ 22 февраля 2012

когда я читаю из файла, используя fread (язык C), возвращаемое значение fread иногда будет равно 0.

Как указано в руководстве:

fread () и fwrite() возвращает количество успешно прочитанных или записанных элементов

нужно ли мне писать код, подобный этому?

int bytes_read;
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) {

}

всегда ли мы должны проверять, успешно ли выполнялись fread или fwrite?

Ответы [ 4 ]

14 голосов
/ 22 февраля 2012

Нет, нет смысла делать такой повторный цикл, если fread или fwrite возвращает меньше ожидаемого числа прочитанных или записанных записей. Другими словами, stdio не похож на низкоуровневые операции read и write, которые могут привести к «коротким» операциям чтения или записи.

Если fread возвращает меньше запрашиваемого количества записей, вы либо нажали EOF, либо произошла серьезная ошибка чтения. Вы можете различить их, проверив feof() и ferror().

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

В любом случае из-за буферизации stdio практически невозможно узнать, сколько было успешно записано, поэтому, если вы столкнулись с ошибкой записи, вам обычно нужно считать файл потерянным и прервать всю операцию.

3 голосов
/ 22 февраля 2012

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

После успешного завершения fread () возвращает количество успешно прочитанных элементов, которое меньше nitems, только если обнаружена ошибка чтения или конец файла. Если size или nitems равен 0, fread () должен вернуть 0, а содержимое массива и состояние потока остаются неизменными. В противном случае, если возникает ошибка чтения, должен быть установлен индикатор ошибки для потока, и errno должен быть установлен для указания ошибки.

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

Функция fwrite () должна возвращать количество успешно записанных элементов, которое может быть меньше nitems, если возникла ошибка записи. Если size или nitems равен 0, fwrite () должен вернуть 0, а состояние потока остается неизменным. В противном случае, если происходит ошибка записи, должен быть установлен индикатор ошибки для потока, и errno должен быть установлен, чтобы указать ошибку

Функции ferror () или feof () должны использоваться, чтобы различать состояние ошибки и условие конца файла.

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

Если фред не работает, он, как правило, будет продолжать работать. Обычно потому, что он достиг конца файла, но, возможно, по какой-то другой причине. Если это не удастся, вы обычно не будете пытаться снова.

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

Да.

Возвращаемое значение всегда должно быть count .

Если это не так - вы должны использовать ferror() или feof(), чтобы определить, достигли ли вы конца файла и / или обнаружили ошибку.

Игнорирование ошибок и / или непредвиденных ситуаций - это то, из-за чего ненадежное программное обеспечение создается для ничего не подозревающих пользователей.

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ <- Junk </p>

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

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