在不同的操作系统中,换行符的存储方式不同,如linux系统以\n表示,而Mac OS以\r表示,windows系统则以\r\n表示,而C语言中,换行则以\n表示,故在不同的操作系统下用C语言读取文本文件时,需要做相应的处理,本文主要介绍windows系统下的处理。

1.  检查文件是否以文本模式打开,如果不是则不需要做特殊处理;

2.  循环依次读取文件中的字符,按以下规则对字符进行处理,直到读取到指定字符数:

1)       如果所读取字符为CTRL-Z,表明文本已经结束,退出循环;

2)       如果所读取字符不为\r,则直接将其复制到缓冲区;

3)       如果所读取字符为\r并且下一个字符不为\n,处理同(2);

4)       如果所读的字符为\r,且下一个字符为\n,则将\n拷贝到缓冲区,下次直接读取下下一个字符;

3.  如果缓冲区中最后一个字符为\r,则再从文件读取一个字符,并进行以下处理:

1)         如果没有读取成功,直接返回;

2)         如果是磁盘文件,且字符不为\n,用seek函数回退文件指针一个字节;

3)         如果是磁盘文件,且字符为\n,则丢弃缓冲区里的\r,存储\n;

4)         如果是管道文件,且字符为\n, 处理同(3);

5)         如果是管道文件,且字符不为\n,则将\n存储在文件句柄的单字节缓冲里;


 

如下图所示,文本文件的内容为:


aaaaaaaaaaaaaa

   bbbbbbbbbbb

ccc

使用下面C语言代码,以二进制方式读取该文件,其输出内容为:

#include <stdio.h>

int main()
{
    FILE *fp = fopen("a.txt", "rb");
    char ch;
    while(fread(&ch, sizeof(ch), 1, fp) == 1) {
        printf("%d ", ch);
    }
    fclose(fp);
    return 0;
}


将rb换成r,以文本方式读取该文件,其\r\n会被转换为\n,输出结果为: