1

我有一个通过 curl 检索到的 HTML 文件,我想在文件中找到某些字符串,以便分析是否收到了预期的响应。

这是我用来搜索字符串的函数:

int find_str(FILE *infile, char *str)
{
    char tmp[512];
    while(fgets(tmp, sizeof(tmp), infile) != NULL)
    {
        if (strstr(tmp, str) != NULL)
        {
            printf("found %s in file\n", str);
            return 1;
        }
    }
    fprintf(stderr, "Couldn't Find %s in file!\n", str);
    return 0;
}

它被称为如下:

if(find_str(html_file, "<h1>Hello World</h1>") == 1)
{ ... }

首先,即使字符串存在,也永远找不到该字符串。其次,如果第一个 if 语句失败,则在另一个 if 语句中调用此函数,但是在调试器中观察执行时,它完全跳过了 while 循环。没有给出垃圾值。如果我观察 tmp 数组,这些值似乎是正常的,尽管它们似乎已被编码。

4

1 回答 1

2

使用该功能,如果您的搜索字符串位于文件中的 512 字节边界附近,它将不匹配,因为您只检查 512 字节块内部。

要解决此问题,您可以将整个文件加载到内存中。如果您决定多次搜索,这对性能也有好处,因为您不必每次都进行 I/O。

这应该可以将文件读入内存:

fseek (infile, 0 , SEEK_END);
int filesize = ftell (infile);
rewind (infile);

char *whole_file = malloc(filesize+1);
if (!(filesize == fread(whole_file, filesize, 1, infile))) {
    // ERROR
}
whole_file[filesize] = '\0';
于 2013-10-17T16:53:01.183 回答