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 ステートメントで呼び出されますが、デバッガーで実行を監視している間、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 に答える