2017-04-06 16 views
0

ファイルからデータを読み込む際に問題があります。私は読書のときに< <を「whileループに入った」と置いた。それはクラッシュするまで繰り返され、ファイルのデータは表示されない。私は私が何を翻訳するのを忘れていなかった願っていバイナリファイルから構造体を読み取る

struct Book 
{ 
    char name[50]; 
    int bookID; 
}; 

struct Writter 
{ 
    char name[30]; 
    int writterID, 
     bookAmount; 
    struct Book book[20]; 
}; 

struct Publisher 
{ 
    char name[20]; 
    int publisherID, 
     qtAutor; 
    Writter writter[30]; 
}; 

Publisher publisher[20]; 

    void savingData(){ 
       fflush(stdin); 
       if((arquivo = fopen("contact.dat","wb+")) !=NULL){ 
         cout<<"It enters the write part"<<endl;//just checking if it enters the write part 
         fwrite(&publisher,sizeof(publisher),1,arquivo); 
         fclose(arquivo); 
       } 

       else{ 
        cout<<"Error: file cannot be opened"; 
       } 
}//savingData 

void loadingData(){ 
      fflush(stdin); 

      if((arquivo = fopen("contact.dat","rb+")) !=NULL){ 
       while(!feof(arquivo)){ 
        fread(&publisher,sizeof(publisher),1,arquivo); 
        if(!feof(arquivo)){ 
        cout<<"Entered the while loop"; 
        }//if 

       }//while 
fclose(arquivo); 
      }//if 

      else{ 
       cout<<"Error: file cannot be opened"; 
       } 

} 

これは、私はより多くの情報を提供します必要であれば、私は、この質問に関連見つけるコードの一部です。

EDIT:私はSam Varshavchikをしてfcloseを取り出しました。それは入力された1回だけ表示されますが、ファイルの情報はまだ読み込まれません。 ファイルには、1人の出版社、1人のWriter、2冊の書籍があります。私は構造体に名前を書くだけで、それ以外はすべてインクリメントによって追加されます。あなたのwhileループの最初の繰り返しで This is a print of the file:

+0

クラッシュしている場所にコード行を置くと便利です。実際にはループする必要はありません。 20個の要素の配列を書き、20個の要素の配列を読み込みます。 2番目のループがファイルの最後を読み取るため、クラッシュする可能性があります。 – Nathan

+0

クラッシュするまで「入力中」を繰り返し続けます。 –

+0

どのようにクラッシュしますか? –

答えて

1
fclose(arquivo); 

、このFILEは閉じられます。閉鎖すると、FILEは無効になります。しかし、どうなる非常に次のものがある:

while(!feof(arquivo)){ 

...それは、ループの別の反復が起こるかどうかをチェックするために、再びFILE状態を確認しようとします。しかし、このFILEはもはや有効ではありません。したがって、これは未定義の動作です。

あなたのコードは、コードが閉じられた後に引き続きFILEを使用しているということです。 fcloseに電話をかけたら、ゲームオーバーです。 FILEオブジェクトに触れることはできません。また、それを参照することもできません。それはなくなった。それは存在しなくなった。これ以上はありません。それは合唱団に見えない。それはex-FILEです。

+0

私はそれを変更し、元の投稿にもう少し追加しました –

関連する問題