Вы на самом деле не говорите, что ошибка (это жизненно важно, когда вы пытаетесь обратиться за помощью), но, если у вас нет ничего похожего на указатели в ваших структурах, выможно сделать все сразу, заменив:
for ( rec_counter=0; rec_counter <= rec_cnt; rec_counter++)
{
fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf);
}
на:
int actual = fwrite (ptr, sizeof(student_record), rec_cnt, pf);
if (actual != rec_cnt) ... a problem occurred.
(вы должны всегда проверять возвращаемое значение).
Так что нет, вам не нужно записывать каждый элемент каждой структуры в массив отдельно, вы можете пойти другим путем и записать весь массив в одно нажатие.
Что касается вашего дополнительногоinfo:
Я получаю файл, в котором есть элемент моих записей, но мусор для всего остального.
Да, если вы напишите больше записейчем вы населили.Другими словами, если rec_cnt
- это размер массива, а не количество заполненных элементов массива, в конце вы получите мусор.
Я предполагал (возможно, неправильно), что rec_cnt
было количество заполненных элементов.У вас должна быть переменная, которая имеет это значение где-то (если rec_cnt
не так), поскольку в противном случае вы не знаете, какие элементы хороши, а какие - мусор.
Используйте , переменная, определяющая, сколько элементов записать с помощью fwrite
.
Если это не мусор более поздних элементов массива, а неиспользуемый пробел внутри каждого элемента, то это ожидаемои не имеет значения.Конструкциям разрешено иметь отступы внутри них (и в конце) для выравнивания.
При условии, что заполнение идентично при записи и чтении, вы можете смело игнорировать его.
Если выравнивание можетотличаться, да, вам, вероятно, придется либо:
- отключить заполнение для структуры (поддержка, определяемая реализацией, например,
#pragma pack
);или - запишите поля структуры отдельно, чтобы удалить заполнение.