带有常规文件的System.AccessViolationException

时间:2014-12-15 19:37:05

标签: c++ visual-c++

我在这段代码上得到了异常: 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;
}
任何人都可以帮忙!!!

2 个答案:

答案 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数组。