C++字符串读写到二进制文件

代码如下,练习IO流读写文件,希望使用cout<<ch2只输出由ch1预写入文件的字符串,但结果是输出了“已成功写入二进制文件烫烫烫烫烫烫已成功写入二进制文件”,该怎么改?

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
void main()
{
char ch1[30]="已成功写入二进制文件",ch2[30];
//注意:ch2只定义了 30个字节的空间

ofstream outfile("test.dat",ios_base::binary|ios_base::trunc);

int i=strlen(ch1);
outfile.write(ch1,strlen(ch1));
//使用.write(),得到二进制文件
outfile.close();

ifstream is;
is.open("test.dat",ios_base::binary);
if(!is.fail())
{
is.read(ch2,strlen(ch1));
char cc;
for(int i=0;i<=strlen(ch2);i++)
//问题出在这,strlen(ch2)=50,这大大超过了定义的大小,怎么回事?
{cc=ch2[i];cout<<cc;}
}
else
{
cout<<"ERROR:Can't open file 'test.dat' !"<<endl;
}
is.close();
}

问题在你的ch2字符串没有‘\0’结尾。这样的话你的strlen(ch2)求出来都是错的,并不是文件里字符串的长度而是30+20。

30是你的ch2的定义的空间长度
20是你的ch1以‘\0’结尾导致它也成了ch2的结尾。这是字符串的存储导致的问题。你写上调试语句i = strlen(ch2);cout<<i;就能知道了。
这个问题很有趣的,你可以自己好好思考一下,有趣的不仅是这个问题而且有时候会发生字符串覆盖的。

解决办法:
在is.read(ch2,strlen(ch1));后面添加语句:
ch2[strlen(ch1)] = '\0';问题就解决了。
温馨提示:答案为网友推荐,仅供参考
相似回答