C++ 从文件错误中读取对象

标签 c++ visual-c++

        fstream file;
        Patient Obj("XXX",'M',"XXX");
        file.open("Patients.dat",ios::in|ios::out|ios::app);
        file.seekg(ios::end);
        file.write((char*)&Obj,sizeof(Obj));
        file.seekg(ios::beg);


        Patient x;

        file.read((char*)&x,sizeof(x));
        x.printallInfo();

        file.close();

我正在使用此代码将对象写入文件,但是当我读取数据时 VC++ 6 崩溃并抛出异常“访问冲突”。(写入成功)

完整代码

#include <iostream>
#include<fstream>
#include <iomanip.h>


#include "Patient.cpp"

using namespace std;

int main(){




            fstream file;
            Patient Obj("XXX",'M',"XXX");
            file.open("Patients.dat",ios::in|ios::out|ios::app);
            file.seekg(ios::end);
            file.write((char*)&Obj,sizeof(Obj));
            file.seekg(ios::beg);


            Patient x;

            file.read((char*)&x,sizeof(x));

            file.close();


    return 0;


}

最佳答案

这似乎是一种脆弱且不可移植的编码类方法。您执行此操作的方式可能会发生的一件事是您没有对正在序列化的数据进行深度复制。例如,如果您的 Patient 类的成员之一是 std::string,则会向文件写入一个裸指针,但不会写入任何字符串数据。更糟糕的是,当你读回它时,指针指向……某处……

处理这个问题的更好方法是实际实现一个特定于类的方法,该方法确切地知道如何序列化和反序列化每个成员。

关于C++ 从文件错误中读取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002734/

相关文章:

c++ - 使用第3方库将C++项目编译为WebAssembly

C++ 转换为基数和 "overwriting"vptr 问题

c++ - 确保只有一个函数实例在运行?

c++ - OpenGL 旋转场景不符合预期

基于模板参数整数返回不同派生类的 C++ 模板

c++ - 同时使用 const 和 non-const 进行参数传递

android - 免费的模糊逻辑库,无法在 android 上解析文件

c++ - TAB 键在 COM 框架上的 MFC 应用程序中不起作用。但是,箭头键有效

c++ - 带有 MSVC++ 编译器的 Gdi+ 出现奇怪的 "Native Graphics"运行时错误

visual-c++ - Windows 凭据提供程序、过滤器和解锁工作站方案