前言
今天写编译原理词法分析,涉及对.txt文件的读取操作,我在文件中放入了一个简单的C程序,如下:
在测试读取文件的时候,因为要跳过空格、换行以及缩进,所以我写了以下函数:
void skipSpace()
{
char ch = prgrm_content[index];
while((ch == '\n') || (ch == ' ') || (ch == '\t')){
index++;
ch = prgrm_content[index];
}
}
当读取到空格、换行、缩进的时候下标指针加一,不做记录。
本以为很简单就能完成的操作,没想到输出的结果并不完全:
???这是什么乱七八糟的?
这时候,在相应的语句处设置断点,并添加变量查看,执行下去就可以看到变量的值是多少:
->->display-expression
0x49c060 <readPrgrmFromFile(char const*)::line> "#include <stdio.h>\r\n#define MAX_LEN 1024\r\n\r\nint main()\r\n{\r\n for(int i = 0;i < MAX_LEN;i++)\r\n printf(\"%d\\n\", i);\r\n return 0;\r\n}"
可以看到,在每个\n
前,都有一个\r
字符,而这个字符是我此前读取文件的操作中从未遇到的,通过百度,我得到了对于\r\n的解释:
\r:回车,回到本行的行首;
\n:换行,转到现位置下一行。
Unix系统里,每行结尾只有“<换行>”,即"\n";Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”,即"\r";。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号
因此,如果有涉及到读取Windows下文件并吞掉空格换行的操作,需要额外判断当前字符是否为\r
,如果是的话需要一并跳过。
void skipSpace()
{
char ch = prgrm_content[index];
while((ch == '\n') || (ch == ' ') || (ch == '\r') || (ch == '\t')){
index++;
ch = prgrm_content[index];
}
}
over