尝试从二进制文件读取时引发违规
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++ 中它不是自动的。
【讨论】:
我会调查的。感谢您的帮助。以上是关于尝试从二进制文件读取时引发违规的主要内容,如果未能解决你的问题,请参考以下文章