我正在编写地址簿程序。有插入,显示和删除选项。在插入时,它接收输入数据并将它们存储到文件中。每当我添加新联系人时,它都会将它们添加到文件中。 将数据保存到文件后,我可以动态分配结构地址簿数组来存储每个联系人详细信息。因此,如果我想显示或删除特定联系人,除了打开文件,比较文件中的每个元素之外,这将很容易。 根据保存到文件中的联系人数量,我们可以为struct addressbook动态分配数组并存储详细信息。
#define FIRST_NAME_LENGTH 15
#define LAST_NAME_LENGTH 15
#define NUMBER_LENGTH 15
#define ADDRESS_LENGTH 15
/* Structure defining a name */
struct Name
{
char lastname[LAST_NAME_LENGTH];
char firstname[FIRST_NAME_LENGTH];
};
/* Structure defining a phone record */
struct addressbook
{
char answer;
struct Name name;
char address[ADDRESS_LENGTH];
char phonenumber[NUMBER_LENGTH];
};
struct addressbook a;
void add_record()
{
printf("enter details\n");
printf("enter lastname of person :\n");
scanf("%s", a.name.lastname);
printf("enter firstname of person :\n");
scanf("%s", a.name.firstname);
printf("enter address of person :\n");
scanf("%s", a.address);
printf("enter phone number of person :\n");
scanf("%s", a.phonenumber);
if((fp = fopen(filename,"a+")) == NULL){
printf("Error opening %s for writing. Program terminated.\n", filename);
abort();
}
fwrite(&a, sizeof(a), 1, fp); /* Write to the file */
fclose(fp); /* close file */
printf("New record added\n");
}
答案 0 :(得分:1)
您的地址簿应该包含联系人列表。因此最好不要使用特定的联系人详细信息来混淆它。更好的方法是:
struct Contact
{
struct Name name;
char address[ADDRESS_LENGTH];
char phonenumber[NUMBER_LENGTH];
};
在AddressBook结构中,您可以将Struct Contact的对象存储为链接列表或数组(如果需要,可以动态增长)。
struct AddressBook
{
Contact *contacts[MAX_CONTACTS];
}
每次读入数据时,都将其存储到新的Contact
对象中,并将指针存储在数组中。但是如果您没有大量的联系人,则不建议将所有联系人存储在内存中,而是可以对文件执行二进制搜索并只读取所需的联系人块。