我正在编写代码来编写" 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;
}
答案 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;
}