C++问题---二进制文件读入问题

-------------------------------------
典型例题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()函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值