繁体   English   中英

如何动态创建结构数组并将数据存储在文件中

[英]how to dynamically create an array of structure and store the data in file

我正在写一个通讯录程序。 有插入,显示和删除选项。 插入时,它将获取输入数据并将其存储到文件中。 每当我添加新联系人时,都会将其添加到文件中。 将数据保存到文件后,我可以动态分配一个结构化地址簿数组来存储每个联系人详细信息。 这样,如果我要显示或删除特定联系人,则比打开文件,比较文件中的每个元素要容易。 根据保存到文件中的联系人数量,我们可以为结构地址簿动态分配数组并存储详细信息。

    #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");
    }

您的通讯录应该包含一个联系人列表。 因此,最好不要将其与特定的“联系方式”弄混。 更好的方法是:

struct Contact
{
  struct Name name;
  char address[ADDRESS_LENGTH];
  char phonenumber[NUMBER_LENGTH];
};

在AddressBook结构中,您可以将Struct Contact对象存储为链表或数组(如果需要,可以动态增长)。

struct AddressBook
{
  Contact *contacts[MAX_CONTACTS];
}

每次读取数据时,将其存储到新的Contact对象中,并将指向该对象的指针存储在数组中。 但是,如果没有大量联系人,则不建议将所有联系人存储在内存中,而是可以对文件进行一些二进制搜索,并仅读取所需的联系人块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM