Использование функции чтения:размер для чтения больше, чем доступен для чтения

StackOverflow https://stackoverflow.com//questions/10705158

  •  13-12-2019
  •  | 
  •  

Вопрос

У меня есть вопрос:

Я использую fread для чтения файла.

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

Используя цикл, последовательно вызовите этот вызов, чтобы я прочитал весь файл.

Что произойдет, когда я подойду к концу файла и не смогу прочитать «размер» * sizeof (Reg), или если вы сможете прочитать только половину этого количества, что произойдет с моим массивом A.Оно будет завершено?Функция вернет ошибку?

Зная, как файл был прочитан при прочитанном?

Эди1:Точно, если деление неточно, когда я читаю последний бит меньшего размера файла, который я читаю, то, чего нет в файле, мне интересно, как изменить размер моего вектора до количества байтов, которые я могу прочитать или разработать динамика лучше.

Это было полезно?

Решение

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

Fread возвращает количество полных элементов, которые фактически прочитали, что может быть меньше, чем количество, если возникает ошибка или если конец файла встречается до достижения подсчета.

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

Ваша логика должна учитывать это: размер файла дает вам ожидаемое общее количество записей, поэтому не составит труда игнорировать конечные данные в буфере (после окончательного fread вызов), что соответствует неинициализированным записям.Одним из подходов может быть счетчик «записей, оставшихся для чтения».

Другие советы

fread() возвращает количество элементов, которые он может прочитать.Поэтому вам нужно проверить возвращаемое значение fread() чтобы узнать, сколько элементов в вашем массиве допустимо.

Он вернет короткое количество элементов или ноль, если произошла ошибка или EOF достигнуто.Вам придется использовать feof() еще ferror() в этом случае, чтобы проверить, какое условие выполнено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top