文本模式,二进制模式, fwrite,fread

 

最进写一个日志类,用到文件操作(windows下的),顺便多封装一个文件类!

 

在我看来不论文本文件、二进制文件都不过是0和1或者是十六进制的(这也是学习硬件的好处,理解底层)。

 

就如我们写入数据 "abc123" ,那么就是写入的 0x61,0x62,0x63,0x31,0x32,0x33 ,

 

但是fwrite,fread这两个函数却隐藏了一些东西, 看下面的代码(测试环境:VC6.0) :

 

 char szBuf[1000];

 

 FILE *pf1 = fopen("C://c.txt","wb"); //以二进制方式写入
 fwrite("abc/n",1,4,pf1);    // 函数返回4
 fclose(pf1);

 

 FILE *pf2 = fopen("C://c.txt","rb"); //以二进制方式读取
 fread(szBuf,1,1000,pf2); // 函数返回4,szBuf的值为 0x61,0x62,0x63,0x0A
 fclose(pf2);

 

最终在windows系统的C://路径下看到c.txt为4字节大小.

 

再看下面代码:

 char szBuf[1000];

 FILE *pf1 = fopen("C://c.txt","wt");//以文本方式写入
 fwrite("abc/n",1,4,pf1);  //返回4                
 fclose(pf1);

 FILE *pf2 = fopen("C://c.txt","rt"); //以文本方式读取
 fread(szBuf,1,1000,pf2);//返回4,szBuf的值为 0x61,0x62,0x63,0x0A
 fclose(pf2);

 

这段代码和上面代码在VC6.0里的所有结果都一样,但是在windows资源管理器中可以看到c.txt文件大小为5个字节!!

为什么呢?

 有一种说法:'/n',即换行符,即十六进制0x0A在文本模式下(wt),fwrite()写入两个字符,下面的代码说明了这一点:

 FILE *pf1 = fopen("C://c.txt","wt"); //以文本方式写入
 fwrite("abc/n",1,4,pf1); // 函数返回4
 fclose(pf1);

 FILE *pf2 = fopen("C://c.txt","rb"); //以二进制方式读取
 fread(szBuf,1,1000,pf2);//返回5,szBuf的值为 0x61,0x62,0x63,0x0D,0x0A 
 fclose(pf2);

 

也就是说:

在文本模式下,

fwrite();把0X0A,翻译成0X0D,0X0A了,

fread();把0x0D,0x0A翻译成0X0A.所以在文本模式下一个换行会返回两个'/n'(0x0A),所以在求行数时要/2

而二进制模式则不会做这样的处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值