Использование функции 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: Точно, если деление не точное, когда я читаю последний бит меньшего размера файла, я буду читать то, чего нет в файле, мне интересно, как мой вектор изменяет размер на количество байтов, которые я могу прочитать, или развивать динамику лучше.


person richardaum    schedule 22.05.2012    source источник


Ответы (2)


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

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

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

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

person Steve Townsend    schedule 22.05.2012
comment
Все, что находится за пределами этого в вашем буфере, не будет изменено. Я думаю, что это должно быть все, что помимо этого в вашем буфере, будет недействительным/неопределенным - person Evan Benn; 05.09.2018
comment
@ Эван Бенн, то, что вы сказали, не всегда верно - чтение выполняется в цикле, если читается более одной записи, данные в конце буфера известны. - person Steve Townsend; 05.09.2018
comment
If a partial member is read, its value is indeterminate. - Хотя это неясно, мне кажется, что реализация может свободно перемещать данные на один элемент за допустимыми элементами, которые он возвращает. - person Evan Benn; 06.09.2018
comment
Я подтвердил, что в моем ящике данные массива перепутаны с «действительными» элементами чтения. - person Evan Benn; 06.09.2018

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

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

person dwalter    schedule 22.05.2012