以前也不是太注意区别这两种方式。
在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说的不同 。