string 写入二进制文件的问题

来源:百度知道 编辑:UC知道 时间:2024/07/03 12:43:04
我定义了一个类,里面有个成员string k.然后我在main()中把它写入二进制文件.然后关闭程序,然后再读刚才保存的那个类,读出来的string是乱码.代码如下:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class node{
public:
string k;
};

void main()
{
node n;
n.k="a";
fstream f("test.dat",ios::binary|ios::in|ios::out);
cout<<n.k;
f.write((char*)&n,sizeof(node));
f.close();
//--------------------------------------------------------------//下面的代码是读出时的代码,替换上面的那些.
node n;
fstream f("d:\\test.dat",ios::binary|ios::in|ios::out);
f.read((char*)&n,sizeof(node));
cout<<n.k;
f.close();
}
我知道出错的地方在于string 的写入.请问有没有好的解决方法.因为我还是希望一次写入一个node类.

你保存的时候应该这样保存:
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;
}