向/从文件读/写自定义对象的向量

时间:2015-01-28 09:08:31

标签: c++ file vector

我正在编写代码来编写" person"对象到文件然后读取文件。我得到正确的输出,但在main()函数结束时,我收到错误"未处理的异常写作位置......" 我做错了什么,如何调试这样的错误? 这是我的代码:

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

class person{
public:
    string name;
    int age;


 person(){

 }
 person(string name,int age){
     this->name= name;
     this->age = age;

 }

  virtual void display(){

       cout << name <<" "<< age << endl;
  }

};



int main () {

fstream f;
f.open("amu.txt",ios::in | ios::out | ios::trunc);
if(f){
    cout<<"file found"<<endl;
}
else{
    cout<<"file not found"<<endl;
    terminate();
}

// creating a vector
vector<person> per;

//populating with "person" objects

for(int i=0;i<100;i=i+10)
{
    person amu("ameykamat",i);
    per.push_back(amu);
}

//wrting objects from vector to the file

for(vector<person>::iterator itr = per.begin(); itr != per.end() ; ++itr)
    {

    f.write((char *)&(*itr),sizeof(*itr));

    }

// taking curson to the start of the file

    f.seekg(0,ios::beg);

//creating temp obj for printing from file
    person amu;
    while(f.read((char *)&amu, sizeof(amu))){
    cout<<(amu.name).c_str()<<" "<<(amu.age)<<endl;
}


   f.close();

system("pause");

  return 0;
}

1 个答案:

答案 0 :(得分:1)

std::string如果不是简单的char[]:没有什么可以证明当你从其地址复制sizeof(std :: string)时,实际上你会复制数据。标准实现使用动态分配,因此您几乎可以确定不会以这种方式复制实际数据!

您应该想象一下序列化格式(例如:年龄,名称长度,名称的空终止字符数组),但您还应该在C ++ FAQ中查找Serialization and Unserialization处的引用。

提供它只能在一台机器(或相同类型的机器)和相同的编译器上运行(即没有架构更改问题),你可以这样实现:

class person {
   ...
    ostream& write(ostream& os) {
        int l = name.length();
        os.write((const char *) &age, sizeof(age));
        os.write((const char *) &l, sizeof(size_t));
        os.write(name.c_str(), name.length());
        return os;
    }

    istream& read(istream& is) {
        int l;
        is.read((char *) &age, sizeof(age));
        if(! is.eof()) {
            is.read((char *) &l, sizeof(size_t));
            if (! is.eof()) {
                char* n = new char[l];
                is.read(n, l);
                name.assign(n,l);
                delete n;
            }
        }
        return is;
    }
}

然后使用:

for(vector<person>::iterator itr = per.begin(); itr != per.end() ; ++itr)
    {
    itr->write(f);
    }
...
while(! amu.read(f).eof()){
    cout<<(amu.name).c_str()<<" "<<(amu.age)<<endl;
}