尝试从二进制文件读取时引发违规

Posted

技术标签:

【中文标题】尝试从二进制文件读取时引发违规【英文标题】:Violation thrown when trying to read from binary file 【发布时间】:2021-04-19 18:20:10 【问题描述】:

我的二进制代码已经卡了一个月了,我无法完成我的工作,因为这是我必须完成的最后一件事。 我有一个包含参赛者所有数据的结构。 我有一个功能,可以输入参赛者数据的价值,例如团队名称,团队家乡,团队成立日期等。 然后我有一个函数可以将该数据写入二进制文件,还有一个函数可以从二进制文件中读取该数据。

我的结构:

struct Team 
    string teamName;
    string teamHometown;
    int foundedDay;
    int foundedMonth;
    int foundedYear;
    int matchPlayed;
    int matchLost;
    int goalsFor;
    int goalsAgainst;
    int goalDifference;
    int Points;
;

我的读写功能:

void writeBinary(Team* T, int& contestantCount) 
    Team Data;
    ofstream File;
    File.open("Data.bin", ios::binary | ios::out);
    if (File.is_open()) 
        File.write(reinterpret_cast<char*>(&Data), sizeof(Team));
        File.close();
        system("cls");
        cout << "|--------------------------------------------------------------------------------------------|" << endl;
        cout << "                            DATA SUCCESSFULLY SAVED TO BINARY FILE" << endl;
        cout << "|--------------------------------------------------------------------------------------------|" << endl << endl;
        system("pause");
    
    else 
        system("cls");
        cout << "|--------------------------------------------------------------------------------------------|" << endl;
        cout << "                                COULD NOT OPEN BINARY DATA FILE" << endl;
        cout << "|--------------------------------------------------------------------------------------------|" << endl << endl;
        system("pause");
    


void readBinary(Team* T, int& contestantCount) 
    Team Data;
    ifstream File;
    File.open("Data.bin", ios::binary | ios::in);
    if (File.is_open()) 
        File.read(reinterpret_cast<char*>(&Data), sizeof(Team));
        File.close();
        system("cls");
        cout << "|--------------------------------------------------------------------------------------------|" << endl;
        cout << "                             SHOWING SAVED DATA FROM BINARY FILE" << endl;
        cout << "|--------------------------------------------------------------------------------------------|" << endl << endl;
    
    else 
        system("cls");
        cout << "|--------------------------------------------------------------------------------------------|" << endl;
        cout << "                                COULD NOT OPEN BINARY DATA FILE" << endl;
        cout << "|--------------------------------------------------------------------------------------------|" << endl << endl;
        system("pause");
    
    cout << Data.teamName << endl;
    system("pause");

我假设我的 write 函数工作正常,因为它没有给我任何代码违规,我可以看到 .bin 文件是使用其中的内容创建的。 当我运行读取功能时,它给了我这个冲突,它给了我终端中的“读取访问冲突”。 这是我运行读取函数时控制台中的结果图片,以及在函数结束后它给我的违规图片。如果我有任何错误或至少向我解释一个替代方案,如果有人能帮我处理代码,我将不胜感激。我还在大学的第一个学期,我们还处于基础 C++ 水平。 Console output screenshot Violation screenshot

【问题讨论】:

你正在尝试的是object serialization,实现它并不像你的代码假设的那么简单。例如,写一个指针并不能保证该指针以后有效。 我会调查的。感谢您的帮助。 【参考方案1】:

您不能将整个struct Team 写入文件中,因为std::string 可能会分配内存。当您在写std::string 并读回它时,您读取的指针将不会指向正确的位置。

相反,您需要一次写入和读取一个结构成员,并为 std::string 做一些特殊的事情。整个练习称为序列化。在 C++ 中它不是自动的。

【讨论】:

我会调查的。感谢您的帮助。

以上是关于尝试从二进制文件读取时引发违规的主要内容,如果未能解决你的问题,请参考以下文章

使用 c++ 时从二进制文件中读取 int 不正确

Dask 从二进制文件中读取数据

从二进制文件中读取并转换为双精度?

从二进制文件读取时将大端转换为小端

在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych

用python从二进制文件中读取32位带符号的ieee 754浮点?