[英]Reading/Writing to a file in 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
字符串對象的指針寫入文件。 如上所述,沒有其他進程可以使用此指針,因此無法讀取文件。
此外,當您嘗試讀取原始對象時,您讀取的原始數據會覆蓋已構造對象中的現有數據,並且該對象將無法再正確構造。
您也不會以二進制模式打開文件,這是錯誤的,因為您寫入和讀取的是原始二進制數據,而不是文本。
常見的解決方案是使用序列化 ,最常見的方法是簡單地重載“ output”和“ input”運算符<<
和>>
。
在重載函數中,您只需使用格式化的<<
和>>
運算符,即可簡單地以文本形式寫入和讀取每個對象。
我將使用序列化框架,可以使用Google的協議緩沖區( https://developers.google.com/protocol-buffers/ )。 如果您認為一個過時的框架過於強大,那么您始終可以編寫自己的序列化框架,我做到了,我確實使用JSON格式對對象進行編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.