c++ - 在 C++ 中读取/写入文件
问题描述
我正在尝试在 C++ 中读取对象并将其写入文件,写入对象工作正常,读取提供分段核心转储。我已经注释了将对象写入文件的代码,在编写时我们可以取消注释该部分并注释读取部分。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class RelianceMart{
string name;
double trolley_number;
public:
RelianceMart(){
name = "NA";
trolley_number = 0;
}
RelianceMart(string name, double trolley_number){
this->name = name;
this->trolley_number = trolley_number;
}
void setname(string name){
this->name = name;
}
string getname(){
return name;
}
void settrolleynumber(double trolley_number){
this->trolley_number = trolley_number;
}
double gettrolleynumber(){
return trolley_number;
}
};
int main(){
string name;
double trl_num;
RelianceMart mart[3];
RelianceMart obj;
// ofstream fout("PersistentStorage.txt");
/*
for(int i=0;i<3;i++){
cin>>name;
cin>>trl_num;
mart[i] = RelianceMart(name, trl_num);
fout.write((char *) & mart[i], sizeof(mart[i]));
}
fout.close();
*/
ifstream fin("PersistentStorage.txt");
while(!fin.eof()){
fin.read((char *) & obj,sizeof(obj));
cout<< obj.getname();
}
fin.close();
return 0;
}
解决方案
的成员std::string
实际上只不过是一个长度的成员变量,一个成员变量是指向实际字符串内容的指针。
在所有现代受保护的多任务操作系统中,指针对于特定进程是私有的和唯一的,没有其他进程(即使是从同一个程序启动的进程)可以重用相同的指针。
写入对象时,会将字符串对象RelianceMart
的指针写入文件。name
如上所述,没有其他进程可以使用此指针,因此无法读取文件。
此外,当您尝试读取原始对象时,您读取的原始数据会覆盖构造对象中的现有数据,并且该对象将无法再正确构造。
您也不要以二进制模式打开文件,这是错误的,因为您写入和读取原始二进制数据,而不是文本。
常见的解决方案是使用序列化,最常见的方法是简单地重载“输出”和“输入”运算符<<
和>>
。
在重载函数中,您只需将每个对象作为文本写入和读取,同样使用格式化<<
和>>
运算符。
推荐阅读
- python - InstagramAPI 仅返回用户关注者列表的一部分
- python-3.x - LDAP 用户认证
- c# - ASP.NET MVC 作业调度程序
- oracle - oracle 12c 形成时区 -5:30
- c# - amazon s3下载“拒绝访问”c#
- reactjs - 在 React 组件中动态导入图像
- mongodb - 已安装 MongoDB,但未显示在程序文件或卸载或更改程序中
- vb.net - 拆分字符串不适用于 CSV 样式文件
- elasticsearch - Stormcrawler:写入弹性集群问题
- java - Youtube Api Crashed,YouTubeService 泄露 IntentReceiver