ios::binary文本方式打开与二进制方式打开的不同

3 篇文章 0 订阅

以前也不是太注意区别这两种方式。

在CSDN上有个帖子,就是讨论的这个,不过没有说清楚,看完后给我感觉好像是两种打开方式没有区别了!

下面举个简单的例子来说明。

有文件data.txt

下面是文本内容///

0 1 2 3 4 5 6 7 8 9 a b c d e 1a bd

///文本内容结束///注意第一行第一个字符后有一个空格///

 

/下面是文本的十六进制内容/  

00000000h: 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20 ; 0 1 2 3 4 5 6 7

00000010h: 38 20 39 20 61 20 62 20 63 20 64 20 65 20 31 61 ; 8 9 a b c d e 1a

00000020h: 20 62 64                                        ;  bd

这是从ultraeidt上截下来的。右边分号后是文本符号,左边是对应的ascII码值。

以文本方式打开时,读的就是文本内容。以二进制方式打开时,读的就是十六进制里的内容。

以C++为例

ifstream ifs("data.txt");///默认以文本打开

int nvalue;

char ch;

ifs>>nvalue;nvalue值为0

ifs>>ch;///ch值为'1'

ifs.close();

///

ifstream ifs("data.txt",ios::binary);///以二进制方式打开

int nvalue;

char ch;

ifs.read((char*)&nvalue,4);nvalue值为540090416

ifs.read(&ch,1);///ch值为'2'

ifs.close();

/

为什么二种方式的结果不差别这么大呢?

可以类比一下来说明问题。以文本方式打开,相当于你从控制台按键盘输入;而以二制方式打开时,文件里面的内容格式就相当于在内存里面是一样的!

文本方式上面的结果就不多解释了。

nvalue在以二进制方式打开时是540090416。原因是data.txt里的二进制序列是302031203220……,前四个字节刚好是0x20312030在内存中的540090416的补码(正数跟原码一样)。

 

注意:

1如果你想以内存的方式读的话,比如某些文件格式编程时,要确保,以二进制方式打开并且用read一类的函数,而不是>>;

2CArchive>>k是像内存方式的读入,>>与1说的不同 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值