2016-12-21 6 views
0

私のプログラムでやりたいことは、人(またはそれ以上)を追加した後、(2)、ケース2に行くときに使用するバイト数を確認することです。 私の#include "このheader.h」です:Cのバイナリファイルについて

struct student { 
    long long int personalnumber; 
    char name[20]; 
    char gender[20]; 
    char program[20]; 
    int age; 
    char email[20]; 
}; 

は、私がここでやっていることは、1をクリックして、プログラムを起動するプログラムは多分2人の学生(そのためのループ)を追加し、を要求するすべての情報を書き込むことです。 (n)をクリックすると、プログラムはオプションに戻ります。 2をクリックすると、バイナリファイルで使用されているバイト数を出力する必要があります。主な機能は次のとおりです。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "header.h" 

int main() 
{ 

    int val, age; 
    long long int personalnumber, size; 
    char email[20], program[20], gender[20], name[20], n; 

    do 
    { 

     system("cls"); 

     printf("1: Add\n\n"); 
     printf("2. info\n\n"); 

     scanf("%d", &val); 
     getchar(); 

     switch (val) 
     { 
     case 1: 

      system("cls"); 
      printf("Add a new student to the database\n"); 

      struct student s1; 

      FILE *myfile; 
      myfile = fopen("students.dat", "wb");   
      if (myfile == NULL)          
      { 
       printf("Could not open the file!\n"); 
       system("pause"); 
       exit(1); 
      }   
      while (1) 
      { 
       printf("\nEnter student personalnumber: "); 
       scanf("%lld", &s1.personalnumber); 
       getchar(); 
       printf("Enter name of student: "); 
       fgets(&s1.name, 20, stdin); 
       printf("Enter the gender of the student: "); 
       fgets(&s1.gender, 20, stdin); 
       printf("Enter the Program of the student: "); 
       fgets(&s1.program, 20, stdin); 
       printf("Enter the Age of the student: "); 
       scanf("%d", &s1.age); 
       getchar(); 
       printf("Enter the students Email: "); 
       fgets(&s1.email, 20, stdin); 

       myfile = fopen("students.dat", "wb"); 
       fwrite(&program, sizeof(struct student), 1, myfile); 

       printf("Do you wish to add more students? Enter y or n"); 
       n = getchar(); 
       getchar(); 

       if (n == 'n') 
       { 
        break; 
       } 
      } 
      fclose(myfile); 

      system("pause"); 
      break; 

     case 2: 

      freopen("students.dat", "rb", myfile); 
      system("cls"); 
      printf("bytes:\n\n"); 

      myfile = fopen("students.dat", "rb"); 
      fseek(myfile, 0, SEEK_END); 
      size = ftell(myfile); 
      rewind(myfile); 
      printf("Size of file is: %lld", size); 

      system("pause"); 

      break; 
     } 

    } while (val != 3); 

    system("pause"); 
    return 0; 

} 
+1

あなたはあなたが望むものを教えてくれました。あなたが持っているものを私たちに示しました。しかしあなたの*問題は何ですか?あなたの質問は何ですか*? –

+0

電子メールアドレスの20文字はちょっと辛いですか? – Bathsheba

+0

まあ、問題は私はコードを実行することはできませんこれはファイルと私は本当に問題が何であるか把握することはできませんので、私には新しいです。電子メールの20文字については、後で修正される予定です。今すぐファイルを書き込んで、使用バイト数を読み取る必要があります。 – orgee

答えて

0

myfile = fopen("students.dat", "wb");のループでは、ファイルを何度も開いています。次に、ファイルに書き込んで、ファイルにあったものを上書きします。そのため、ファイルには最後の書き込みのみが含まれます。おそらく(おそらく)fopenの2回目の呼び出しは、「ファイルがすでに別のプロセスによって開かれているため」に失敗しますが、公開コールの戻り値を確認しないため、気付かないでしょう。

fopenコール、特にオープンモードについてお読みください。

ヒント(完全な解決策を提供しない):ループの前にオープンコールを配置します。ファイルが存在するかどうかをチェックし、ファイルを切り捨てるか、読み取り/書き込みモードで開くかを決定する必要があります。同様に、ループの後にfcloseコールを配置します。そのため、作業を終了した後にのみ閉じます。

また、openの戻り値が成功したかどうかを確認する必要があります。


あなたが書いていることについては、文字列 programを書いていますが、書き込み呼び出しには struct studentのサイズを持っています。それは正しくありません。また、配列へのポインタを関数に渡すためには、配列の名前だけを記述する必要があります。コンパイラはこれを配列のアドレスに変換するので、アドレス演算子( &)を使用する必要はありません。
case 2:については、ファイルを複数回開いて(呼び出しが成功したかどうかをチェックしないで)、同じ間違いを繰り返します。 freopenはハンドルに関連付けられているファイルを閉じます(そのファイルは既に閉じられているため、エラーが発生する可能性があります)。新しいファイルが開きます。その後、ファイルに再度 fopenを呼び出すと、おそらくエラーが発生します。 caseの最後にファイルを閉じる必要があります。

関連する問題