我在从文件加载数据时遇到问题。我在读取时放了一个 cout<<"entered the while loop"并且它一直重复直到崩溃,不显示文件的任何数据。
这是我发现与这个问题相关的代码部分,如果需要我会提供更多信息:
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";
}
}
我希望我没有忘记翻译任何东西。
编辑:我做了 Sam Varshavchik 的操作并取出了 fclose。它只出现了1次输入,但文件上的信息仍然没有加载。 在文件中,我有 1 位出版商、1 位作家和 2 本书。我只在结构上写名字,其他的都是增量添加的。 This is a print of the file:
最佳答案
fclose(arquivo);
在 while
循环的第一次迭代中,此 FILE
将被关闭。一旦关闭,FILE
就不再有效。但是接下来会发生的事情是:
while(!feof(arquivo)){
... 它将尝试再次检查 FILE
状态,以检查是否应该进行另一次循环迭代。但是这个 FILE
不再有效;因此这是未定义的行为。
您的错误是您的代码在关闭后继续使用 FILE
。一旦调用 fclose
,游戏就结束了。您不能以任何方式触摸或引用 FILE
对象。它不见了。它不复存在了。它已经不复存在了。它加入了合唱团——隐形的。这是一个前 FILE
。
关于c++ - 从二进制文件中读取结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43244783/