为什么在 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 中的“<<”运算符,告诉它您希望如何打印字段。
我正在使用 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 中的“<<”运算符,告诉它您希望如何打印字段。