【问题标题】: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,实现它并不像你的代码假设的那么简单。例如,写一个指针并不能保证该指针以后有效。
  • 我会调查的。感谢您的帮助。

标签: c++ binary write


【解决方案1】:

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

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

【讨论】:

  • 我会调查的。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多