用C ++读/写文件

时间:2018-07-08 14:11:51

标签: c++ fstream ifstream ofstream

我正在尝试在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;
}

2 个答案:

答案 0 :(得分:1)

std::string的成员实际上只是长度的成员变量,而成员变量是指向实际字符串内容的 pointer

在所有受保护的现代多任务操作系统中,指针是专用的,并且是特定进程所独有的,其他任何进程(甚至不是从同一程序启动的进程)都不能重用同一指针。

写入RelianceMart对象时,将name字符串对象的指针写入文件。如上所述,没有其他进程可以使用此指针,因此无法读取文件。

此外 ,当您尝试读取原始对象时,读取的原始数据会覆盖已构造对象中的现有数据,并且该对象将无法再正确构建

您也不会以 binary模式打开文件,这是错误的,因为您写入和读取的是原始二进制数据,而不是文本。


常见的解决方案是使用serialization,最常见的方法是重载“输出”和“输入”运算符<<>>

在重载函数中,您只需再次使用格式化的<<>>运算符就可以将每个对象作为文本写入和读取。


最后,请阅读Why is iostream::eof inside a loop condition considered wrong?

答案 1 :(得分:0)

我将使用序列化框架,而您可以使用Google的协议缓冲区(https://facebook.github.io/react-native/docs/scrollview#refreshcontrol)。 如果您认为一个成熟的框架过于强大,那么您始终可以编写自己的序列化框架,我做到了,我确实使用JSON格式对对象进行编码。