c++ string类二进制文件怎么读

这个代码究竟错在哪,怎么改,一定要用string类#include<iostream>#include<string>#include<fstream>usingname... 这个代码究竟错在哪,怎么改,一定要用string类
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{
string a,b;
cin>>a;
ofstream ofile;
ofile.open("d:\\1.dat");
ofile.write((char*)&a,sizeof(a));
ofile.close();
ifstream ifile;
ifile.open("d:\\1.dat");
ifile.read((char*)&b,sizeof(b));
ifile.close();
cout<<b<<endl;
}
展开
 我来答
百度网友32cdd9945
推荐于2016-06-07 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1928万
展开全部
ofile.write((char*)&a,sizeof(a)); 改成
ofile.write((char*) a.c_str(), a.length()); 或者
ofile << a;

ifile.read((char*)&b,sizeof(b)); 改成
ifile >> b;

试试,你要理解 read write函数的意思,不要乱写代码
红尚杭玲
2020-05-09 · TA获得超过996个赞
知道小有建树答主
回答量:1604
采纳率:100%
帮助的人:7.4万
展开全部
你保存的时候应该这样保存:
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;
}
至于原来你写的程序能够正常工作,是因为你往文件里写的是string类,包含了字符串指针,而同一个进程里面指针是不会变的,所以你读出来之后ok。
当你把“保存”的那一段代码删掉后,你再编译运行这个程序,这时str1/str2分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码。
我改的程序c语言风格有点重,呵呵,你可以自己看着再改改。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
致远9xa7f
2013-05-04 · 超过13用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:39万
展开全部
你那个a前面加&符号干嘛啊?还有b前面的&符号!a和b本身就是一个string类的对象,取地址的时候不要加&取址符号!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
现实有点难度
2013-05-04 · TA获得超过123个赞
知道答主
回答量:100
采纳率:0%
帮助的人:24.8万
展开全部
ios::binary 不要用STRING
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式