原创 【博客大赛】C语言写文件以二进制方式和普通方式的区别

2014-3-17 22:50 2109 13 4 分类: 软件与OS 文集: C语言

这是一个基础问题,但是我发现知道的人还真不多,在项目组里遇到的,事情是这样的:

前几天我写了一段从Server端下载图片到本地终端的代码,通过数据流的监控来看,下载下来的确实是和服务器上的图片大小一样,但是写在本地之后,貌似多了那么几个字节,而且图片打不开,把算法检查了好几遍都没有问题,由于服务器是在Ubuntu上搭建的,而客户端是在Windows上使用模拟器模拟的,于是怀疑是平台不同导致的,马上翻书,还真是这么回事!

首先,这个问题使用如下代码来测试:

#include

 

void CreateFile_A();

void CreateFile_B();

 

int main()

{

    CreateFile_A();

    CreateFile_B();

    return 0;

}

 

void CreateFile_A()

{

    FILE* fpa = fopen("a","w");

    fprintf(fpa,"hello\n");

    fclose(fpa);

}

 

void CreateFile_B()

{

    FILE* fpb = fopen("b","wb");

    fprintf(fpb,"hello\n");

    fclose(fpb);

}

CreateFile_A()是以普通方式打开文件a并写入字符串,CreateFile_B()是以二进制方式打开文件b并写入字符串,以下截图为使用差分工具对文件以十六进制的形式进行比较的。

捕获windows.jpg

问题出来了,一个是7bit,一个是6bit,该代码运行在Win7下运行的。

如果这段代码在Linux下编译并运行,然后将a和b以十六进制的形式进行比较的话,如下图:

捕获linux.jpg

好吧~问题就在这里,OK,总结一下:

Windows平台下

如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"\r\n"转换成"\n";当写入文件的时候,系统会将"\n"转换成"\r\n"写入。

如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。

Unix/Linux平台下,“文本”与“二进制”模式没有区别。

数据有字符型和非字符型(数)两种。按文本方式写文件指的是将数据转换为对应的字符型数据之后再写入文件。对于字符型数据,由于其本身就是ASCII码字符,一般不必转换,直接写入文件。但是,由于不同的系统对于换行符('\n')有不同的处理(转换)方式,在有的系统(如Windows)下也会对 '\n' 作适当的转换。

对于非字符型数据,都要进行转换处理。例如:int m = 12; 以及 double f = 2.3;,分别按照 "%d"、"%lf" 方式将 m 和 f 写入文件的时候,写入的分别是 '1'、'2' 两个字符以及 '2'、'.'、'3' 等三个字符的ASCII码值。显然,如果按照二进制方式写的话,在文件中一般 m 要占 4 个字节、f 要占 8 个字节。

问题解决了,但是感觉很不爽,翻开《C Primer Plus》,仔细看了看,书中对这个问题的描述非常详尽,我勒个去~~~

图片可能看不清楚,可以点击图片看高清图,附件中有代码和图片,另外,推荐使用BeyondCompare工具进行比较。

本文由电子匠人原创,如需转载请注明出处,谢谢。

文章评论2条评论)

登录后参与讨论

电子匠人 2014-3-24 19:39

用起来就坑了

用户1570367 2014-3-20 21:41

这些细节平时真的没注意

相关推荐阅读
电子匠人 2017-07-13 23:40
夏夜随想
今天一个小朋友来找我扯蛋,说工资很低但是自己一定会很努力。看得出他确实很踏实,而且很坚决的说,自己定了个小目标,明年年初调薪工资能上8k/月。我一直看着他,听他讲完后,跟他说:“你的目标不够好,改一改...
电子匠人 2016-03-11 11:21
谁都有被骂成狗的日子
昨天下午,慧子**打电话给我,说她领导又骂了她,电话里的慧子**一肚子委屈——这已经不是第一次了,但凡那位领导好好说几句暖人心的话,慧子**也是绝对会屁颠屁颠的去干活。 我忽然想起刚毕业的...
电子匠人 2014-11-24 17:52
【博客大赛】年末侃大山——说说技术
今天新项目过来个领导,跟我聊了一会,他问我的一个问题是:“你擅长哪方面的技术?”这下把我给问愣了,我说,我哪样也不擅长。 和几个朋友一起准备创业,现在还在筹备阶段,经常会接触到一些人问这样的问...
电子匠人 2014-11-20 21:56
【博客大赛】年末侃大山——说说做事
在我还没有毕业的时候,一个师兄跟我说,第一份工作一定要去大公司,即使钱少,当时我很不理解,问他原因,他说,避免你成为一个山寨工程师。 虽然他告诉了我原因,但是在很长的一段时间内,我还是没理解这句话的...
电子匠人 2014-11-12 23:13
【博客大赛】年末侃大山——说说梦想
     前几天,某电商的移动客户端首页有这么一句话:“梦想是要有的,万一实现了呢?” 读小学的时候我的梦想是当一个超人,读初中的时候我的梦想是没有考试,读高中的时候梦想是隔壁班的姑娘的花裙子...
电子匠人 2014-11-08 23:31
【博客大赛】年末侃大山——前言
一眨眼就到了年末,上半年忙掉了腚,下半年忙掉了脑子,去年还在EDN写了几个专栏,今年却没怎么做贡献,想来真是惭愧。 昨晚看邮箱,看到今年最后一季的主题竟然是随便侃,像我这么有(ai)能(chu...
我要评论
2
13
关闭 站长推荐上一条 /2 下一条