尽量不要使用文本模式
来源:互联网 发布:增值税发票税控软件 编辑:程序博客网 时间:2024/06/10 03:10
尽量不要使用文本模式读取文件
当我们使用C的库函数读取文件时,会有文本模式和二进制模式两种读取模式。一些传输数据的协议比如TFTP、FTP也有文本和二进制模式的区分。既可以使用文本模式也可以使用二进制模式时,尽量使用二进制模式。
文本模式和二进制模式读取文件时,差别主要是在回车换行的处理上,不同系统对回车换行的处理不一致。
CR: Carriage Return, 0X0D, “/r”
LF: Line Feed, 0X0A, “/n”
Dos和windows采用回车+换行(CR+LG)表示下一行
UNIX采用换行符(LF)表示下一行
MAC机采用回车符(CR)表示下一行
Unix、Linux的C的库函数处理文件时不区分文本和二进制,但是Windows系统下C的库函数读取和写入文本文件时会自动处理回车换行。Windows下以文本模式读取文件时,读取到0D
以文本模式写文件时,会自动在每个
则写入到文件中的是 0D 0D
具体Windows下C运行库如何处理可以参考VC2005附带的C运行库的源代码。
文本模式下读取文件时处理回车换行的代码在/VC/crt/src/read.c 的265~356行。
Line:291 /* *p is CR, so must check next char for LF */
if (p < (char *)buf + bytes_read - 1) {
if (*(p+1) == LF) {
p += 2;
*q++ = LF; /* convert CR-LF to LF */
}
else
*q++ = *p++; /* store char normally */
}
文本模式下写文件时处理回车换行的代码在/VC/crt/src/write.c 的268~308行。
Line:282 /* fill the lf buf, except maybe last char */
while ( q - lfbuf < sizeof(lfbuf) - 1 &&
(unsigned)(p - (char *)buf) < cnt ) {
ch = *p++;
if ( ch == LF ) {
++lfcount;
*q++ = CR;
}
*q++ = ch;
}
Windows下文本模式打开文件时,要慎用ftell()函数。由于ftell()函数实现中对LF进行了特殊处理,导致ftell()返回的结果可能不是我们需要。
使用二进制模式可以保证文件的内容没有被修改,在需要进行特殊处理的地方我们自己可以进行特殊的处理,而类库自作聪明的处理很多时候反而弄巧成拙。
- 尽量不要使用文本模式
- 尽量不要使用FindWindow
- 尽量不要使用全局变量
- 尽量不要使用触发器
- 尽量不要使用 distinct
- 尽量不要使用塑料制品
- 尽量不要使用匿名类
- 尽量不要使用IP分片
- C++尽量不要使用#define
- 尽量不要使用Class.class.getResourceAsStream
- 为什么尽量不要使用CSS Expression
- 尽量不要使用gb2312避免乱码
- 尽量不要使用默认的东西
- 尽量不要使用TerminateThread与SuspendThread
- 为什么尽量不要使用using namespace std?
- 为什么尽量不要使用using namespace std?
- 尽量使用初始化而不要在构造函数里赋值
- c++使用智能指针时,尽量不要暴露原始指针
- 龙抬头的日子
- 找工作(3)——谷歌,互网络绝顶高手
- Asp.net 中,在服务端向客户端写脚本的常用方法
- 苹果iPhone, 营销神话难以复制
- 88250的CSDN Blog的配置
- 尽量不要使用文本模式
- 数据库系列之死锁(四)
- 摩斯密码表
- oracle主键自增
- ASP.NET页面指令详解
- 用OpenInventor实现的NeHe OpenGL教程-第二十课
- [转自JeffreyZhao]正确使用异步操作
- 原来添加控件不需要Create
- [转]C#中Dispose和Close的区别!