如何在读取文件时“绕过”控制字符?

时间:2018-01-08 11:33:12

标签: c

第一次在这里问一个问题,我一直在寻找我的所有答案,而不需要发布一些东西,但今天我被困在我的小程序中(我不是程序员,所以如果错的话,我可能会这么做)。 问题在于:我正在寻找一些日志文件,同时寻找一些关键字,相当简单。有时,日志文件包含许多控制字符的行(我不明白,对我没用),导致程序停止读取:

 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...
    }
}

如果有人能给我一个如何以简单的方式避免这些角色的暗示,我真的很感激! 谢谢!

2 个答案:

答案 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不会被视为文件结束。