读取二进制文件会导致访问冲突 我是C++新手,我尝试把数据从结构写入二进制文件,然后读取文件并将数据存储回结构中。以下是我迄今为止所做的工作: #include<iostream> #include<fstream> #include<string> using namespace std; struct Data{ string name; int points[6]; }; int main(){ Data stream[20]; Data my[20]; for (int i = 0; i < 20; i++){ stream[i].name = "name" + to_string(i); for (int j = 0; j < 6; j++) { stream[i].points[j] = j + i; } } ofstream writer("data.dat", ios::binary | ios::trunc); if (writer.is_open()){ writer.write((char *)stream, sizeof(stream)); writer.close(); } else cout << "Error opening file.\n"; ifstream reader("data.dat", ios::binary); if (reader.is_open()){ reader.read((char *)my, sizeof(my)); reader.close(); } else cout << "Error opening file.\n"; for (int i = 0; i < 20; i++){ cout << my[i].name; for (int j = 0; j < 6; j++) { cout << " " << my[i].points[j]; } cout << endl; } system("pause"); return 0; } #包括 #包括 #包括 使用名称空间std; 结构数据{ 字符串名; 积分[6]; }; int main(){ 数据流[20]; 我的数据[20]; 对于(int i=0;i

读取二进制文件会导致访问冲突 我是C++新手,我尝试把数据从结构写入二进制文件,然后读取文件并将数据存储回结构中。以下是我迄今为止所做的工作: #include<iostream> #include<fstream> #include<string> using namespace std; struct Data{ string name; int points[6]; }; int main(){ Data stream[20]; Data my[20]; for (int i = 0; i < 20; i++){ stream[i].name = "name" + to_string(i); for (int j = 0; j < 6; j++) { stream[i].points[j] = j + i; } } ofstream writer("data.dat", ios::binary | ios::trunc); if (writer.is_open()){ writer.write((char *)stream, sizeof(stream)); writer.close(); } else cout << "Error opening file.\n"; ifstream reader("data.dat", ios::binary); if (reader.is_open()){ reader.read((char *)my, sizeof(my)); reader.close(); } else cout << "Error opening file.\n"; for (int i = 0; i < 20; i++){ cout << my[i].name; for (int j = 0; j < 6; j++) { cout << " " << my[i].points[j]; } cout << endl; } system("pause"); return 0; } #包括 #包括 #包括 使用名称空间std; 结构数据{ 字符串名; 积分[6]; }; int main(){ 数据流[20]; 我的数据[20]; 对于(int i=0;i,c++,struct,ifstream,C++,Struct,Ifstream,当您以字节方式复制字符串时(您正在有效地执行此操作),您有两个对象都认为它们拥有相同的数据,因此当它们超出范围时,它们都会尝试释放它。因此,BOOM。您可以在此处实现相同的效果: { std::string test = "hi"; std::string t2; memcpy(&t2, &test, sizeof(std::string)); } // <-- death { std::string test=“hi”; std::字符串t2;

当您以字节方式复制
字符串时(您正在有效地执行此操作),您有两个对象都认为它们拥有相同的数据,因此当它们超出范围时,它们都会尝试释放它。因此,BOOM。您可以在此处实现相同的效果:

{
    std::string test = "hi";
    std::string t2;
    memcpy(&t2, &test, sizeof(std::string));
} // <-- death
{
std::string test=“hi”;
std::字符串t2;
memcpy(&t2,&test,sizeof(std::string));

}//您希望
sizeof(my)
是什么?当您打印
sizeof(my)
时,它实际上是什么?请看,您不能像那样在二进制文件中插入和输出
std::string
。您需要形成一个本机类型的纯旧数据协议来编写该文件,然后坚持使用它。