c++一个类里的string类型怎么用二进制文件保存

class Machine
{
public:
Machine(){a=0;name="1";};
int rea(){return a;};
void putname(){a=1;cin>>name;};
void waitname(){a=2;cin>>name;};
void delename(){a=0;name="0";};
void ina(int r){a=r;};
void inname(string ti){name=ti;};
string rename(){return name;};
void play();
private:
int a;
string name;
};
Machine stud[6][20];
Machine stud1[6][20];
void save()
{
int a1,a2;
ofstream outfile("name6.txt",ios::binary);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(a1=0;a1<6;a1++)
{
for(a2=0;a2<20;a2++)
{
outfile.write((char*)&stud[a1][a2],sizeof(stud[a1][a2]));
}
}
for(a1=0;a1<6;a1++)
{
for(a2=0;a2<20;a2++)
{
outfile.write((char*&)stud1[a1][a2],sizeof(stud1[a1][a2]));
}
}

outfile.close();
}
void resave()
{
int b1,b2;
string name5;
ifstream infile("name6.txt",ios::binary);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(b1=0;b1<6;b1++)
for(b2=0;b2<20;b2++)
{
infile.read((char*)&stud[b1][b2],sizeof(stud[b1][b2]));

}
for(b1=0;b1<6;b1++)
for(b2=0;b2<20;b2++)
{
infile.read((char*)&stud[b1][b2],sizeof(stud[b1][b2]));
}

infile.close();
}

读取不了srting也保存不了弄了好久了求大神

你保存的时候应该这样保存:
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr << "Error ! " <<endl;
return 0;
}
outfile.write(str1.c_str(),str1.size()+1);
/*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。
改成这样以后,写入文件里的就是实际的字符串了。
写入的长度应该是字符串的长度(包括结束符'\0')*/
outfile.write(str2.c_str(),str2.size()+1);
outfile.close();
return 1;
}
读取的时候这样读取:
int main()
{
string str1;
str1.reserve(100);/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/
ifstream infile("temp.dat",ios::binary);
if (! infile)
{
cerr << "Error ! " <<endl;
return 0;
}
infile.read((char * )str1.c_str(),100);/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/
cout <<str1 <<endl; //输出第一个字符串
cout << (char*)(str1.c_str() + strlen(str1.c_str())+1) << endl;//输出第二个字符串
return 1;
}
温馨提示:答案为网友推荐,仅供参考
相似回答