您的位置:首页 > 移动开发 > IOS开发

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

2009-06-03 19:59 246 查看
以前也不是太注意区别这两种方式。

在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说的不同 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: