第一次在这里问一个问题,我一直在寻找我的所有答案,而不需要发布一些东西,但今天我被困在我的小程序中(我不是程序员,所以如果错的话,我可能会这么做)。 问题在于:我正在寻找一些日志文件,同时寻找一些关键字,相当简单。有时,日志文件包含许多控制字符的行(我不明白,对我没用),导致程序停止读取:
Bla bla bla KEYWORD
Bla Bla [SUB][EM][ACK] (and a lot more)
Bla Bla KEYWORD"
我读了第一个关键字,但控制字符似乎就像我的循环生命终结标记一样,因此我从未读过。 这是我的工作:
FILE *fpIn = fopen(inFile, "r");
char chaine[100];
char searchKeyword[] = "KEYWORD";
while (!feof(fpIn))
{
fgets(chaine, 100, fpIn);
if(strstr(chaine, searchKeyword))
{
// do whatever...
}
}
如果有人能给我一个如何以简单的方式避免这些角色的暗示,我真的很感激! 谢谢!
答案 0 :(得分:1)
如果您使用的是Windows,控制字符0x1A(Control-Z或SUB)将被视为文件结束指示。
您可以通过以二进制模式打开文件来避免这种情况(在fopen
中使用“rb”代替“r”,但是您会发现所有行都有\r
(最后的0x0D)(在文本模式下,行结尾被更正为单个\n
。)
答案 1 :(得分:1)
假设[SUB]实际上是ascii代码0x1A,它曾经是CP/M中(文本)文件标记的结尾。出于兼容性原因,它在MS / DOS中保留了这个角色,没有人愿意在最新版本的Windows中清除它。
删除这个有问题的字节的最简单方法是以二进制模式打开文件。 \r
不会从行尾删除(行尾在Windows上标记为\r\n
,在Linux上标记为\n
),但至少0x1A不会被视为文件结束。