为什么在 C++ 中使用 class 对象写入文件的数据以非文本格式存储?

Why does the data written in a file using a class object in C++ get stored in a non-text format?

我正在使用 C++ 将数据写入文件。当我只使用一个变量从用户那里获取输入然后写入文件时,它只是简单地存储在该文件中。我的意思是我可以通过用记事本打开文件来读取我输入的内容。但是当我定义一个 class 并使用它的对象将数据写入文件时,它会以一种不可读的格式存储。我无法通过使用记事本打开文件来读取我输入的内容。但是,在这两种情况下,当我使用 C++ 读取文件然后显示它们时,它们都会显示我输入的内容。所以,我想问一下,为什么数据在使用 classes 时以其他格式存储,而在使用简单变量时却不是。

使用普通变量:

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

int main () {

   //char data[100];
   string data;
   ofstream outfile;
   outfile.open("afile.dat");
   cout << "Writing to the file" << endl;
   cout << "Enter your name: ";
   cin>>data;
   outfile << data << endl;
   cout << "Enter your age: ";
   cin >> data;
   cin.ignore();
   outfile << data << endl;
   outfile.close();
   ifstream infile;
   infile.open("afile.dat");
   cout << "Reading from the file" << endl;
   infile >> data;
   cout << data << endl;
   infile >> data;
   cout << data << endl;
   infile.close();
   return 0;
}

文件中的数据:

Ram
14

使用Class:

#include <bits/stdc++.h>
using namespace std;

class person{
public:
    int age;
    string name;

    int retAge(){
        return age;
    }
    string retName(){
        return name;
    }
    void takeInput(){
        cout<<"\nEnter Age: ";
        cin>>age;
        cout<<"\nEnter Name: ";
        cin>>name;
    }
    void show(){
        cout<<"\nAge: "<<age<<" and Name: "<<name;
    }
};

int main(){
    string filename = "someFile.dat";
    ofstream outfile;
    outfile.open (filename.c_str(), ios::app);
    person p, q;
    p.takeInput();
    p.show();
    outfile.write ((char *)(&p), sizeof(p));
    outfile.close();
    ifstream infile;
    infile.open(filename.c_str());
    infile.read((char*)&q, sizeof(q));
    infile.close();
    q.show();
    return 0;
}

文件中的数据:

   ”Xã 

您正在写入 一个人的地址,转换为字符 *:outfile.write ((char *)(&p), sizeof(p));。它不会神奇地转换为显示对象所有内容的可读字符串;你需要自己做。

现在,这个人的地址是指向内存的指针,类似于 0x42f1a5e2,这就是您在文件中写入的内容。将其作为字符串读回会给您一些随机字符。

例如,年龄是一个int,所以你需要将它转换成一个字符串并写入那个字符串,等等所有字段。

您的 class 包含 2 个字段:int 和一个 string;两者都不是文本,即使是后者(它本身包含依赖于实现的字段)。这些数据类型上的“<<”运算符知道如何将其转换为文本。

另一方面,您正在使用它来编写:outfile.write ((char *)(&p), sizeof(p));。这会将结构表示为字节流。并且这两个字段都将按原样写出,无需任何转换为​​文本。 write 是低级函数,不做也不能做任何转换。

您真正需要做的是重载 Person class 中的“<<”运算符,告诉它您希望如何打印字段。