C++为什么将含有string类型的数据成员的类对象转换为char*类型会出错?

把string改成char就没问题
头文件

#pragma once
#include<string>
using namespace std;
class Extest {
public :
    Extest();
    void show();
    void input();
private:
    int a;
    int b;
    string c;//char c[20]={'\0'};
};

cpp文件

#include<iostream>
#include<fstream>
using namespace std;

#include "extest.h"
int main()
{
    Extest obj1;
    obj1.input();
    Extest obj2;
    ofstream out("Object.txt", ios_base::out | ios_base::trunc | ios_base::binary);
    if (!out.is_open())
        cout << "FAIL" << endl;
    out.write((const char*)&obj1, sizeof(Extest));
    out.close();

    ifstream in("Object.txt", ios_base::in | ios_base::binary);
    if (!in.is_open())
        cout << "FAIL" << endl;
    while (in.peek() != EOF)
    {
        in.read((char*)&obj2, sizeof(Extest));
    }
    in.close();
    obj2.show();
    return 0;
}
Extest::Extest()
{
    a = 0;
    b = 0;
    c = "NO";//for(int i=0;i<20;i++)c[i]={'\0'};
}

void Extest::show()
{
    cout <<"a:"<< a << endl;
    cout << "b:" << b << endl;
        cout << "c:" << c << endl;
}

void Extest::input()
{
    cin >> a >> b;
    cin>> c;
}

图片说明

请各路大神解答!

c++

2个回答

这里涉及到C++ Pod的问题, std::string 不是一个Pod类型,所以你不能直接二级制memcopy,如果用你注释的是没问题的。

qq_46004857
KGLL 回复fengqiao1999: 感谢!
4 个月之前 回复
fengqiao1999
fengqiao1999 回复KGLL: out.write((const char*)&obj1.a, sizeof(int));基础类型你可以这样写入,string类型你需要先写入字符串长度,然后写入字符串内容,读取的时候逆向操作即可
4 个月之前 回复
qq_46004857
KGLL 那如果要用string ,应该怎么改呢
4 个月之前 回复

直接运行你的代码,结果如下图

图片说明

qq_46004857
KGLL 确实是能运行,但是返回值并不是0;调试的时候发现是访问冲突
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐