在不同的操作系统中,换行符的存储方式不同,如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语言代码,以二进制方式读取该文件,其输出内容为:
|
将rb换成r,以文本方式读取该文件,其\r\n会被转换为\n,输出结果为: