Использование функции fread: размер для чтения больше доступного для чтения
У меня вопрос:
Я использую 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);
Используя цикл, последовательно вызывайте этот вызов, чтобы заставить меня прочитать весь мой файл.
Что произойдет, когда я подойду ближе к концу файла, и я не смогу прочитать "size" * sizeof (Reg), или если вы будете доступны только для чтения половины этой суммы, что произойдет с моим массивом A. Это будет завершена? Функция вернет ошибку?
Зная, как файл был прочитан фредом?
Edi1: Точно, если деление не точное, когда я читаю последний бит меньшего размера файла, который я читаю, вещей, которых нет в файле, мне интересно, с моим изменением размера вектора до количества байтов, которое я могу прочитать, или лучше развивать динамику.
2 ответа
fread возвращает количество прочитанных записей. Все, что находится выше в вашем буфере, может быть искажено, не полагайтесь на эти данные.
fread возвращает количество фактически прочитанных полных элементов, которое может быть меньше, чем count, если возникает ошибка или если конец файла встречается до достижения count.
Функция не будет читать после конца файла: наиболее вероятным случаем является то, что вы получите кучу полных буферов и затем (окончательное) частичное чтение буфера, если размер файла не будет в точности кратным длине буфера.
Ваша логика должна соответствовать этому - размер файла дает ожидаемое общее количество записей, поэтому не должно быть трудно игнорировать конечные данные в буфере (после последнего fread
вызов), что соответствует неинициализированным записям. Счетчик "записи, оставшиеся для чтения" будет одним из подходов.
fread()
возвращает количество элементов, которые он мог прочитать. Таким образом, вы должны проверить возвращаемое значение fread()
чтобы узнать, сколько элементов в вашем массиве являются действительными.
Будет возвращено короткое количество элементов или ноль, если произошла ошибка или EOF
достигнуто Вам придется использовать feof()
Зонда ferror()
в этом случае проверить, какое условие выполнено.