2011-09-18 12 views
0

私はアドレス帳用のプログラムを作成しています。挿入、表示、削除のオプションがあります。挿入時には、入力データを取り込んでファイルに格納します。私は新しい連絡先を追加するたびにファイルに追加します。 データをファイルに保存した後、各連絡先の詳細を格納する構造体アドレス帳の配列を動的に割り当てることはできますか?そのため、特定の連絡先を表示または削除したい場合は、ファイルを開くこと以外はファイル内の各要素を比較するだけです。 ファイルに保存された連絡先の数に応じて、構造体アドレス帳用の配列を動的に割り当てて詳細を保存できますか?構造体の配列を動的に作成し、ファイルにデータを格納する方法

#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

あなたのアドレス帳は連絡先のリストを保持することになっています。だから、特定の連絡先の詳細でそれを乱雑にしない方がいいです。これを行うには良い方法は、次のようになります。

あなたのアドレス帳の構造では
struct Contact 
{ 
    struct Name name; 
    char address[ADDRESS_LENGTH]; 
    char phonenumber[NUMBER_LENGTH]; 
}; 

あなたがいずれかのリンクリストや配列(あなたがそれを必要とする場合、動的に成長している)などの構造体との接触のオブジェクトを格納することができます。あなたがデータを読み込む

struct AddressBook 
{ 
    Contact *contacts[MAX_CONTACTS]; 
} 

毎回は、新しいContactオブジェクトにそれを保存して、配列内のそのオブジェクトへのポインタを格納します。しかし、連絡先が大量にある場合は、それらをすべてメモリに保存することはお勧めしません。ファイルのバイナリ検索を行い、必要な連絡先ブロックだけを読み取ることができます。

関連する問題