как динамически создать массив структур и сохранить данные в файл - PullRequest
0 голосов
/ 18 сентября 2011

Я пишу программу для адресной книги.Есть варианты вставки, отображения и удаления.При вставке он принимает входные данные и сохраняет их в файл.всякий раз, когда я добавляю новый контакт, он добавляет их в файл.После сохранения данных в файл, могу ли я динамически выделить массив структурной адресной книги для хранения каждой контактной информации.Так что, если я захочу отобразить или удалить определенный контакт, это будет легко, кроме открытия файла, сравнения каждого элемента в файле.В зависимости от количества контактов, сохраненных в файле, можем ли мы динамически выделить массив для структурной адресной книги и сохранить детали.

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

1 Ответ

1 голос
/ 18 сентября 2011

Ваша адресная книга должна содержать список контактов. Так что лучше не загромождать его конкретными контактными данными. Лучший способ сделать это:

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

В вашей структуре AddressBook вы можете хранить объекты Struct Contact в виде связанного списка или массива (динамически растущего, если вам это нужно).

struct AddressBook
{
  Contact *contacts[MAX_CONTACTS];
}

Каждый раз, когда вы читаете данные, сохраняйте их в новый объект Contact и сохраняйте указатель на этот объект в вашем массиве. Но если у вас нет большого количества контактов, не рекомендуется хранить их все в памяти, скорее вы можете выполнить некоторый двоичный поиск по файлу и прочитать только нужный блок контактов.

...