Есть ли у fread и fwrite сбой? как справиться с этим?

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

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

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

Мне нужно написать такой код?

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

}

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

Ответ 1

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

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

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

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

Ответ 2

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() должны использоваться для различения условия ошибки и условия конца файла.

Ответ 3

Да.

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

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

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

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

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

Ответ 4

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