У вас есть несколько проблем с тем, как вы справляетесь с массивами. Прежде всего, эта строка:
for (i = 0; i < count; i++) fwrite(&students, sizeof(students), 1, fileptr);
То, что вы здесь делаете, запускает цикл с одним проходом для каждой введенной записи и записывает весь массив из 25 элементов в файл на каждом проходе. Таким образом, если было введено 3 записи, вы пишете 75 , большинство из которых являются мусором или избыточны. То, что вы, вероятно, хотите здесь, больше похоже на:
for (i = 0; i < count; i++)
fwrite(&students[i], sizeof(students[i]), 1, fileptr);
... где размер - это размер одного элемента массива (одной записи), а адрес - это адрес записи, которую вы сейчас пишете, а не адрес целого массив.
У вас есть похожая проблема при чтении данных позже, среди прочего:
rewind(fileptr);
for (i = 0; (another = fgetc(fileptr)) != EOF && i < N; i++) {
fseek(fileptr, -1, SEEK_CUR);
fread(&students, sizeof(students), 1, fileptr);
}
Во-первых, fread(&students, sizeof(students), 1, fileptr);
следует изменить так же, как fwrite()
ранее, на fread(&students[i], sizeof(students[i]), 1, fileptr);
. Причины те же: вы читаете по одной записи за раз в цикле, поэтому вам нужно читать этот элемент не только в начало массива каждый раз, но и объем данных, которые вы read должен быть размером этой записи , а не размером всего массива.
Во-вторых, хотя исправление вышеприведенного должно заставить его работать, вы можете легко изменить цикл так, чтобы вам не нужно было читать одиночный char
в выражении цикла, чтобы проверить EOF. Вы должны действительно проверить это, проверив возврат из fread()
в цикле. Что-то вроде:
rewind(fileptr);
for (i = 0; i < N; i++) {
if (fread(&students[i], sizeof(students[i]), 1, fileptr) != 1)
break;
}
Или еще лучше, просто прочитайте N
элементов без цикла и используйте возвращаемое значение, чтобы сказать вам, сколько было прочитано:
rewind(fileptr);
i = fread(students, sizeof(students[0]), N, fileptr);