从二进制文件中读取结构

时间:2017-04-06 02:45:42

标签: c++ file

我在从文件加载数据时遇到麻烦。我在阅读时放了一个cout<<“进入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";
                }

}

我希望我不会忘记翻译任何内容。

编辑:我做了Sam Varshavchik并把fclose拿出来了。它只出现1次输入,但仍未加载文件中的信息。 在文件中我有1个出版商,1个写作者和2本书。我只在结构上写下名字,其他一切都是通过增量来添加的。 This is a print of the file:

1 个答案:

答案 0 :(得分:1)

fclose(arquivo);

while循环的第一次迭代中,此FILE将被关闭。关闭后,FILE不再有效。但接下来会发生的事情是:

while(!feof(arquivo)){

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

您的错误是您的代码在关闭后继续使用FILE。一旦你致电fclose,就会结束比赛。您无法以任何方式触摸FILE对象或引用它。它消失了。它不复存在。它不复存在了。它加入了唱诗班 - 隐形。这是前 - FILE