我在这段代码中得到异常: Project4.exe 中出现“System.AccessViolationException”类型的未处理异常
附加信息:试图读取或写入 protected 内存。这通常表明其他内存已损坏。
但它不是 protected 文件或只读文件!!! ,当我使用文本文件时,错误消失了
#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;
}
任何人都可以提供帮助!!!
最佳答案
正如我在评论中提到的,抛出异常是因为您试图写入或读取无效的内存位置。
在您的案例中,最可能的罪魁祸首是:
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 字节整数?
关于c++ - 带有常规文件的 System.AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491757/