Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115836
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 403
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-22 11:19
文章分类
文章存档

2014年(21)

我的朋友

分类: C/C++

2014-03-03 17:32:55



最近在工作中遇到一个非常奇怪的问题,我利用了一个第三方的EML文件解析器来对eml文件进行解析,但是却发现有些文件可以很好的进行解析,而有些文件则无法解析。但是利用文本编辑器打开看其中的内容和格式却没有发现其中的差别。然后用16进制打开以后发现了问题。可以工作的文件中每一行结尾时"\r\n",而不能被解析的文件中每一行结尾时"\r"。所以产生了无法解析的问题。


这突然给了我一个教训,其实我们写程序时一直都是用"\n"来判断是否将要换行,而有一些特别的文件则是用"\r”来换行的。


先来讲一下\r和\n的含义吧,\r的意思是“回车”也就其实等于你按下enter,而\n的意思是“换行”也就是使光标下移一行。而我们在编辑文件时不同的操作系统也会产生不同的差异,在Windows中,如果我们按下换行,则编辑器会自动帮我们产生\r\n;而在类Linux中,如果我们按下换行,则编辑器只会产生\n。


那怎么来处理如上所属不同操作系统中换行符不同的问题呢?答案是用不同的打开方式来打开。


首先使用测试代码和文件内容如下(三个文件显示完全一样):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
#include
#include
#define MAXSIZE 1000
int main()
{
    //Windows格式\r\n换行,文本内容为12345\r\n12345
    FILE * infile1 = fopen("windows.txt", "rb");
    char windowsBuf[MAXSIZE];
    fread(windowsBuf, sizeof(char), 1000, infile1);
    fclose(infile1);
    //Linux格式\n换行,文本内容为12345\n12345
    FILE * infile2 = fopen("linux.txt", "rb");
    char linuxBuf[MAXSIZE];
    fread(linuxBuf, sizeof(char), 1000, infile2);
    fclose(infile2);
    //其他格式\r换行,文件内容为12345\r12345
    FILE * infile3 = fopen("other.txt", "rb");
    char otherBuf[MAXSIZE];
    fread(otherBuf, sizeof(char), 1000, infile3);
    fclose(infile3);
    system("PAUSE");
    return 1;
}


1.使用二进制方式打开。windowsBuf中的内容为12345\r\n12345;linuxBuf中的内容为12345\n12345;otherBuf中的内容为12345\r12345。所以二进制方式打开文件时不会对文件内容做任何变化,只是原封不动的读出文件的内容。


2.使用文本方式打开(在测试代码中把"rb"改成"r")。windowsBuf中的内容为12345\n12345;linuxBuf中的内容为12345\n12345;otherBuf中的内容为12345\r12345。所以当用文本方式打开文件时,不管什么操作系统,都会把\r\n和\n同意变成\n。从而消除了差异化的为。但是如果换行符是\r时,则也不会做任何变化。


所以最终的结果是如果是二进制方式打开,我们需要自己处理三种换行情况;而如果是用文本方式打开,我们只需要处理\r和\n的情况。

阅读(3127) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~