最进写一个日志类,用到文件操作(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
而二进制模式则不会做这样的处理