c++ - 带有常规文件的 System.AccessViolationException

标签 c++ visual-c++

我在这段代码中得到异常: 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/

相关文章:

c++ - 无法从类方法访问类变量

c# - .NET 三重 des 到 Windows API

c++ - 使用 Soil Unresolved external 因素

c++ - #include <Header.h> 未编译,而 #include "Header.h"正在编译

c++ - 在 0x00f85069 处获取未处理的异常

C++ STL 容器和引用

c++ - 内部类使用外部类模板参数时(仅当使用 `ostream`时)编译失败

c++ - 制作图书馆时是否应避免使用宏

c++ - typeid 导致不同的编译器

c++ - 如何将 wcstombs 转换为 wcstombs_s