【发布时间】:2015-01-28 09:08:31
【问题描述】:
我正在编写代码以将“人”对象的向量写入文件,然后读取该文件。我得到了正确的输出,但是在 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;
}
【问题讨论】:
-
person不能轻易复制,这是行不通的。 -
“可简单复制”是什么意思?
-
f.write((char *)&(*itr),sizeof(*itr));从根本上被破坏了,因为每个person对象中的std::string name成员可能包含指向实际存储文本内容的动态分配(“堆”)内存的指针。您保存指针值,但如果您从另一个进程(甚至是同一程序的另一个实例/运行)重新加载指针值,则字符串内容将不会出现在这些虚拟地址处。将文本本身保存到文件 ala 中:f << itr->age << ' ' << itr->name << '\n;', then read alawhile (f >> amu.age && std::getline(f, amu.name)) ...use amu...`.