2017-04-06 77 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"; 
       } 

} 

我希望我没有忘记任何翻译。

编辑:我做了什么山姆Varshavchik,并把fclose了。它只输入一次,但文件上的信息仍未加载。 在文件上我有1个发布者,1个Writer和2本书。我只在结构上写上名字,其他的都是按增量加入的。 This is a print of the file:

+0

它可能有助于将代码行放置在崩溃的位置。它不需要实际循环。你写一个20个元素的数组并读取一个20个元素的数组。它可能会崩溃,因为第二个循环尝试读取文件的末尾。 – Nathan

+0

它一直重复“输入while循环”直到崩溃。 –

+0

它如何崩溃? –

回答

1
fclose(arquivo); 

在您while循环的第一次迭代,这FILE将被关闭。一旦关闭,FILE不再有效。但是,这会发生非常接下来的事情就是:

while(!feof(arquivo)){ 

...它会尝试再次检查FILE状态,以检查循环的另一次迭代应该发生。但是这个FILE不再有效;因此这是未定义的行为。

你的错误是你的代码在关闭后继续使用FILE。一旦你致电fclose,游戏就结束了。您无法以任何方式触摸FILE对象或引用它。它消失了。它不复存在。没有更多。它加入了无形的合唱团。这是一个ex-FILE

+0

我改变了这一点,并增加了一些原始帖子 –