Windows下文件读取填坑记录——跳过文件换行符

前言

今天写编译原理词法分析,涉及对.txt文件的读取操作,我在文件中放入了一个简单的C程序,如下:
Windows下文件读取填坑记录——跳过文件换行符_第1张图片在测试读取文件的时候,因为要跳过空格、换行以及缩进,所以我写了以下函数:

void skipSpace()
{
	char ch = prgrm_content[index];
	while((ch == '\n') || (ch == ' ') || (ch == '\t')){
		index++;
		ch = prgrm_content[index];
	}
}

当读取到空格、换行、缩进的时候下标指针加一,不做记录。
本以为很简单就能完成的操作,没想到输出的结果并不完全:
Windows下文件读取填坑记录——跳过文件换行符_第2张图片
???这是什么乱七八糟的?
这时候,在相应的语句处设置断点,并添加变量查看,执行下去就可以看到变量的值是多少:
Windows下文件读取填坑记录——跳过文件换行符_第3张图片

->->display-expression
0x49c060 <readPrgrmFromFile(char const*)::line> "#include \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

你可能感兴趣的:(C++)