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

标签 c arrays file data-structures dynamic-memory-allocation

我正在编写一个地址簿程序。有插入、显示和删除选项。在插入过程中,它获取输入数据并将它们存储到文件中。每当我添加新联系人时,它都会将它们添加到文件中。 将数据保存到文件后,我可以动态分配一个结构地址簿数组来存储每个联系人详细信息吗?因此,如果我想显示或删除特定联系人,那么除了打开文件、比较文件中的每个元素之外,这将很容易。 根据保存到文件中的联系人数量,我们可以动态地为结构体地址簿分配数组并存储详细信息。

    #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 对象中,并将指向该对象的指针存储在数组中。但是,如果您的联系人数量较多,则不建议将所有联系人存储在内存中,而是可以对文件进行一些二进制搜索并仅读取所需的联系人 block 。

关于c - 如何动态创建结构数组并将数据存储在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458788/

相关文章:

javascript - 使用 forEach() 时如何将参数 'this' 绑定(bind)到数组的每个元素?

php - 在文件中查找一个单词,然后将接下来的 10 个值放入数组中

android - 如何在android中的gridview中添加选中的图片

c - 尝试根据排序的学生 ID 显示文件中的学生数据

java - 如何在Swing中读取和显示大文本文件?

java - 查找某个单词或短语在文档中出现的次数

c - 检测 ETW 何时丢弃事件

c - gprof profiler 说我的 C 程序花费的时间比实际少得多

c - 我正在使用 4 个 for 循环,2 个工作正常,其余 2 个显示问题 3,4 个循环显示无效答案

c - C语言链表中的节点