Проверьте этот код, и позвольте мне объяснить вам, что все было не так в вашем коде.
#include<stdio.h>
typedef struct
{
int select;
char lastname[25];
char firstname[25];
char address[25];
char phonenumber[25];
} addressbook;
#define ARRAYLEN 2
addressbook a[ARRAYLEN];
FILE *fp;
int main()
{
int i;
fp = fopen("addressbook.dat","a+");
for( i=0; i<ARRAYLEN ; i++)
{
printf("enter details\n");
printf("enter lastname:\n");
scanf("%s", a[i].lastname);
printf("enter firstname:\n");
scanf("%s", a[i].firstname);
printf("enter address:\n");
scanf("%s", a[i].address);
printf("enter phone number:\n");
scanf("%s", a[i].phonenumber);
fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */
}
fclose(fp);
fopen("addressbook.dat", "r");
for(i=0; i<ARRAYLEN; i++)
{
fread(&a[i], sizeof(a), 1, fp );
printf("lastname:%s\n", a[i].lastname);
printf("firstname:%s\n", a[i].firstname);
printf("address:%s\n", a[i].address);
printf("phonenumber:%s\n", a[i].phonenumber);
}
fclose(fp);
return 0;
}
На самом деле, ваш код как есть (кроме уже отредактированного вами редактирования) не так уж и некорректен, но в нем есть некоторые небольшие, но важные недостатки.
Единственное реальное изменение заключается в следующем: -
fwrite(&a[i],...
и
fread(&a[i],...
т.е. передать адрес конкретного элемента массива, который вы хотите записать, а не весь массив. Кроме того, даже если вы передавали адрес всего массива, нет. байт / символов, которые вы просили библиотеку написать, был просто sizeof (структура), поэтому, по сути, оставшиеся были усечены. Без этого то, что вы записывали в файл, было что-то вроде ...
A <-- file contents after, first iteration
AAB <-- file contents after, second iteration
AABABC <-- file contents after, third iteration
AABABCABCD <-- file contents after, fourth iteration
....
Думаю, из этого вы поймете, что было не так. Кроме того, содержимое вашего addressbook.dat было текстовым, поэтому простой «cat addressbook.dat» (в Linux) сказал бы вам, что не так: -)
Вы открываете и закрываете файл на каждой итерации. Теперь это не ошибка, а просто неоптимальная вещь, и вполне вероятно, что вы не хотите этого делать. Файловые операции являются дорогостоящими, а их открытие / закрытие стоит довольно много циклов ЦП. Вам лучше открыть файл один раз для всех записей и один раз для чтения. (Конечно, однажды можно удалить fclose (), выполненную после write-block, и fopen (), выполненную также и перед read-block, просто получив указатель файла на начало файла - оставленный для вас как упражнение).
Во время тестирования никто не хочет вводить столько данных. Поэтому я добавил #define (и с более новым компилятором вы также можете заменить его определением const), который определяет макрос, который содержит размер массива адресной книги. Для тестирования я держу его в «2». Для производства вы можете просто изменить это значение на «1000», и оно все равно будет работать. Опять же, это не ошибка, просто лучший стиль, если хотите.
Да, и кстати, пожалуйста, сделайте ваш отступ правильно. Вы пришли из мира Python? Или это может быть артефакт того отступа, который необходим SO для размещения кодовых блоков.
НТН