c++ - 从二进制文件中读取结构

标签 c++ file

我在从文件加载数据时遇到问题。我在读取时放了一个 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/

相关文章:

c++ - 局部变量和尾调用优化

matlab - 如何从 MATLAB 中的 .fig 文件中提取数据?

node.js - 无法获取/资源/卡片

java - 从 Android 上的根文件夹读取文件

android - AAsset_read 与 fopen

c# - System.IO.File 是一种类型而不是命名空间

c++ - 如何避免 __builtin___memset_chk 警告?

c++ - 如何最好地封装窗口句柄?

c++ - 十六进制数据 (RGB888) 中的图像文件到 BMP、JPG、PNG 或其他格式

c++ - 无法从 initializer_list 转换为我的类型,该类型具有模板化可变参数构造函数