2011-12-08 11 views
0

私はCプログラミングに関する質問があります。これはバイナリファイルに関するものです。私のコードでは、私はそれをバイナリファイルから読み書きするようにしましたが、何らかの理由でそれをしません。私はいくつかのことを変えようとしましたが、エラーはどこにも表示されません。そして、これはちょっと難しいことですが、このコードではそれが残されています私はプログラム全体を完了しているので、それは通常よりも少し神経質になります。私がやっていないことと、バイナリファイルを読み書きするために何をすべきかを指摘してください。 :Cプログラム:バイナリファイルとの間で書き込みはできませんか?

#define MAX 4 

//========================-STRUCTURE-===================================================================== 

struct person{ 

char name[30]; 
char mail[30]; 
char tele[30]; 

}; 

struct person p[MAX]; 

//========================-MAIN FUNCT-=============================================================== 
int main() 
{ 

bool continue=true,exists=false; 
int answer,i; 
char filnme[20]; 

FILE *fil; 

printf("Would you like to open an already existing file?[y/n]: "); 
scanf("%d",&answer); 
if(answer=='y'||answer=='Y') 
{ 
    finns=true; 
} 
else finns=false; 

getchar(); 

printf("\n\nType the name of the file you will use: "); 
scanf("%s",filnme); 

if(exists) 
{ 

    fil = fopen(filnme,"rb"); 

    for(i=0;i<MAX;i++) 
    { 
     while(feof(fil)==0) 
      { 
      fread(&p, MAX, 1, fil); 
      printf("%s %s %s\n",p.name,p.mail,p.tele); 
     } 

    } 

    fclose(fil); 
} 

else fil = fopen(filnme,"wb"); 

do 
{ 

    system("cls"); 

    int choice; 

    printf("What would you like to do?"); 
    printf("\n_______________\n"); 
    printf("1. Add another person to the list\n"); 
    printf("2. Print the entire list\n"); 
    printf("3. Remove information from the list\n"); 
    printf("4. Sort\n"); 
    printf("5. Change information\n"); 
    printf("6. Search\n"); 
    printf("7. Exit\n"); 
    printf("\nChoice: "); 
    scanf("%d",&choice); 
    printf("\n"); 

    system("cls"); 

    switch(choice) 
    { 

     case 1: 

     addtolist(); 
     getch(); 
     break; 

     case 2: 
     write(); 
     getch(); 
     break; 

     case 3: 
     remove(); 
     getch(); 
     break; 

     case 4: 
     sort(); 
     getch(); 
     break; 

     case 5: 
     change(); 
     getch(); 
     break; 

     case 6: 
     search(); 
     getch(); 
     break; 

     case 7: 
     continue=false; 
     break; 

     default: 
     printf("Not a valid choice!"); 
     getch(); 
     break; 

    } 

}while(continue); 

for(i=1;i<=MAX;i++) 
{ 

     fwrite(&p, MAX, 1, fil); 

} 

fclose(fil); 

system("cls"); 

} 

関数の宣言など、私はそれをカバーしています。 eメイン。

ありがとうございます!

+0

ポインタを使用する前に 'fopen()'が成功したことを確認してください! –

+0

既存のファイルを開くかどうかの答えは変数 'finns'に渡されます。 'exists'を使ってファイルを読み書きするかどうかを決定します。 –

+1

"continue"という名前の変数があります。これはC/C++の予約語です。 – selbie

答えて

2

freadおよびfwriteは正しく使用されていません。

fread(&p, MAX, 1, fil); 

は次のようになります。

fread(&p[i], sizeof(person), 1, fil); 

同様fwriteコールのために。そのよう

ループにfreadfwriteを呼び出す代わりに、一度に書き込み/配列全体を読むことです:

fread(&p, sizeof(person), MAX, fil); 
+0

Phew、ありがとう、一束、それはバナナ私を運転していた! – user956281

+0

もう1つは、ファイルに書き込むと思いますが、ファイルを読み込んで、リスト全体を印刷するように指示すると、「リストには0人がいる」と表示され、名前はありません。それはバイナリからの読書や印刷機能と何か関係がありますか?あるいは、それをfor-loopに追加しなければならないので、それを読み取るすべての行は名前、メール、電話に分類されます。 – user956281

0

が継続C/C++の予約キーワードである - 使用しないでくださいブール変数名として。

フィンランド人は、あなたがのfopenの戻り値をチェックしていない

(ブール値とする)宣言されていません。ファイルが正常に開かれたかどうかはどのように分かりますか?

freadのwhileループは、すぐ近くのどこかを見ません。

これはあなたの書き込みループの

int records_read = 0; 
size_t count; 

count = 0; 
for (i = 0; i < MAX; i++) 
{ 
    count = fread(&p[i], sizeof(p[i]), 1, fil); 
    if (count == 0) 
    { 
     break; 
    } 
    records_read++; 
} 

同じくらい良く見える

他のものから離れて
for(i=0;i<MAX;i++) 
{ 
    fwrite(&p[i], sizeof(p[i]), 1, fil); 
} 
0

、scanf関数( "%d個(私は "私" の開始値を調整することに注意してください) "、&答え)は、ay/n文字ではなく数字の読み取りを試みます。

+0

私はちょうどその笑については、助けてくれてありがとう=) – user956281

関連する問題