-------------------------------------
典型例题6:C++问题---二进制文件读入问题
-------------------------------------
1 #include <iostream>
2 #include <fstream>
3 #include <iomanip>
4 using namespace std;
5
6 void init_array(char* ch, int length) //将数组全部置0
7 {
8 memset(ch, 0, length);
9 }
10
11 void show_array(char* ch, int length)
12 {
13 for(int i = 0; i < length; ++i)
14 {
15 cout<<setw(4)<<hex<<(int)ch[i];
16 }
17 cout<<endl<<endl;
18 }
19
20 int main()
21 {
22 char out[10]={0x31, 0x32, 0x0A/*换行*/, 0x0D/*回车*/,0x20/*空格*/, 0x48, 0x3C, 0x09/*制表*/, 0x45, 0x55};
23 char in[10];
24
25 cout<<"二进制文件里的内容:"<<endl;
26 show_array(out, 10);
27 ofstream wf;
28 wf.open("text.dat", ios::out | ios::binary);
29 wf.write(out, 10);
30 wf.close();
31
32 init_array(in, 10);
33 ifstream rf1;
34 rf1.open("text.dat", ios::in | ios::binary);
35 rf1.read(in, 10);
36 rf1.close();
37 cout<<"ifstream.read() 读入结果:"<<endl;
38 show_array(in, 10);
39
40 init_array(in, 10);
41 ifstream rf2;
42 rf2.open("text.dat", ios::in | ios::binary);
43 int n = 0;
44 while(rf2 >> in[n++]);
45 rf2.close();
46 cout<<"ifstream>>in[n] 读入结果:"<<endl;
47 show_array(in, 10);
48
49 return 0;
50 }
------------------------
$ ./a.out
二进制文件里的内容:
31 32 a d 20 48 3c 9 45 55
ifstream.read() 读入结果:
31 32 a d 20 48 3c 9 45 55
ifstream>>in[n] 读入结果:
31 32 48 3c 45 55 0 0 0 0
结果分析:
从运行结果就可以看出,用“>>”的这种方式没有读入0x0A、0x0D、 0x20、0x09这几个字符,
而这几个字符正好是换行、回车、空格、制表符,也就是通常所说的空白字符。众所周知,cin>>默认是
不读入 空白字符的,其实文件的“>>”读入方式也是如此,如果二进制文件的哪个字节恰好与空白字符
的ASCII码相同,就会被舍弃,这一点是不期望 的,当文件较大时,遇到这种情况的概率是很高的。所
以用“>>”读入二进制文件,读入的字节数会小于文件本身的字节数。
综上所述,用C++读入二进制文件时,不能用“>>”这种方式,要使用read()函数。
C++问题---二进制文件读入问题
最新推荐文章于 2021-08-10 16:10:33 发布