我在这段代码上得到了异常: Project4.exe
中发生了未处理的“System.AccessViolationException”类型异常附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
但它不是受保护的文件或只读! ,当我使用文本文件时,错误消失
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct student{
string name;
int age;
};
int main(){
student s1, s2, s3;
s1.name = "basel";
s1.age = 20;
ofstream in;
in.open("example.std" ,ios::binary);
in.write((char*)&s1, sizeof(s1));
in.close();
ifstream out;
out.open("example.std" ,ios::binary);
out.read((char*)&s2, sizeof(s2));
cout << s2.name;
return 0;
}
任何人都可以帮忙!!!
答案 0 :(得分:1)
正如我在评论中提到的,抛出异常是因为您试图在无效的内存位置写入或读取。
您案件中最可能的罪魁祸首是:
out.read((char*)&s2, sizeof(s2));
您是否尝试使用调试器单步执行代码?哪条线路出错?
您正在尝试将结构序列化,然后反序列化为文件。但几乎可以肯定的是,有一些对齐问题会导致问题(以及名称成员是指向另一个数据结构的指针)
您可以修改代码以按成员序列化结构的内容,然后以类似的方式反序列化:
// Serialize
ofstream out;
out.open("example.std", ios::binary);
out.write(s1.name.c_str(), sizeof(char)*s1.name.size());
out.write((char*)&s1.age, sizeof(int));
out.close();
现在出现了棘手的部分:反序列化。你怎么知道这个字符串有多长?你应该假设字符串与文件一样长,减去用于存储年龄的4字节整数吗?
答案 1 :(得分:0)
在您的代码中,您正在尝试将结构存储到文件中并在结构声明时将其读回:
struct student{
string name;
int age;
};
根据您的代码建议,您还希望存储字符串&#34; name&#34;的内容,但
in.write((char*)&s1, sizeof(s1));
不会将字符串的内容写入文件,因为std :: string internal包含指向内容的指针,您只需要写入指向文件的指针的值。因此,当您读取备份时,会出现内存错误。
要归档所需内容,您可以使用结构中具有固定大小的char数组。