2011-11-21 13 views
0
#include <stdio.h> 

#pragma pack(push) 
#pragma (1) 

typedef struct contact {  
    char firstname [40];  
    char lastname [40]; 
    char address [100]; 
    char phone[10]; 
}contact; 

#pragma pack(pop) 

int main() 
{ FILE *pFile; 
    contact entry = {"", "", "", ""}; 
    char choice; 

    pFile = fopen("C:\\contacts.txt", "w+"); 

if(!pFile){ 
    printf("File could not be open"); 
    return 1; 
    } 

printf("Choose a selection\n\n"); 
printf("1. Enter First Name\n"); 
printf("2. Enter Last Name\n"); 
printf("3. Enter Address\n"); 
printf("4. Enter Phone Number\n\n"); 
scanf("%d", &choice); 

switch (choice){ 

    case 1: 
     printf("First name: \n");  
     fgets(entry.firstname, sizeof(entry.firstname),pFile); 
     break; 
    case 2: 
     printf("Last name: \n");  
     fgets(entry.lastname, sizeof(entry.lastname),pFile); 
     break; 
    case 3: 
     printf("Address: \n");  
     fgets(entry.address, sizeof(entry.address),pFile); 
     break; 
    case 4: 
     printf("Phone Number: \n"); 
     fgets(entry.phone, sizeof(entry.phone),pFile); 
     break; 
    default: 
     printf(" No Choice selected, Ending Address Book Entry system"); 
     break; 
    } 
     fwrite(&entry, sizeof(contact), 1, pFile); 

     printf("Enter a new contact?"); 
     scanf("%s", &choice); 

    //while(choice != 'n'); 

fclose(pFile); 

getchar(); 
return 0; 
} 

このコードはエントリを選択した後、エントリを入力してEnterキーを押すと、変数 'エントリ'の周りのスタックが壊れているとクラッシュしました。私はそれが私が使用している私のfwrite関数だと確信しています。私は、最初のパラメータfwriteが書き込まれる要素の配列へのポインタであることを知っているが、私はちょうど今混乱していると思う。どんな助けでも大歓迎です。クイック予約の問題

+4

ハイブリッドCとC++の記述をやめてください。また '#pragma pack'はおそらく' struct'には 'char'しか含まれていないので、何もしません。 –

+0

それはしません。ちょうど練習のため – Questioneer

+2

@SethCarnegie: '#pragma pack'について言えば真実かもしれませんが、私はそれが意図を表しているので、今のところ良いことだと思うし、データ構造の将来の修正にも弾力があります。 – jwd

答えて

2

コンソールではなく、ファイルから読んでいるので、あなたは

fgets(entry.firstname, sizeof(entry.firstname),stdin); 

にすべてのあなたの

fgets(entry.firstname, sizeof(entry.firstname),pFile); 

を変更する必要があります。また

scanf("%s", &choice); 

scanf("%d", &choice); 

であなたは、文字列と数字を読み、charに保管しようとしています。どちらも、あなたが最大のパフォーマンスを探していない場合はあなたの人生を容易にするためにifstreamcingetline、およびstd::stringを使用して、これを書き換える考えなければならない、と述べた

scanf("%c", &choice); 

でなければなりません。

+0

提案をしても似たようなエラーが出ています:変数 'c​​hoice'の周りのスタックが壊れていました – Questioneer

+2

@Questioneer ok、それは他の 'scanf'、' scanf( "%d"、&choice); 'クラッシュ。これが、このような可変的な関数を避けるべき理由です。正当な理由がない場合は、Cのような機能を使用しないでください。 –

+0

ご協力ありがとうございます。ここから、私の問題はコード全体の論理だと思う。本当にありがとう – Questioneer