0

私の C 演習では、2 つのテキスト ファイルを 1 行ずつ比較する必要があります。 ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

私の計画は次のとおりです。

まず、fgets() 関数を使用して、文字列の時点で 1 行を読み取ります

次に、sscanf() 関数を使用して文字列を解析 (空白を無視) し、それらを比較します。

ただし、コードが文字列 (行) の最初の単語を読み取っただけで、間違った結果が得られたという問題がありました。しかし、コードを変更すると、常に「ファイルが異なります」と表示されます。私を助けてください。私のロジックは間違っています >< これが私のコードです

int comp_line(FILE *fp1, FILE *fp2){
char l1[1024];
char l2[1024];
char w1[1024];
char w2[1024];
char *c1;
char *c2;

/*initialize*/
c1 = fgets(l1,1024,fp1);
c2 = fgets(l2,1024,fp2);

sscanf(w1,"%1023s",l1);
sscanf(w2,"%1023s",l2);

while (c1 != NULL && c2 != NULL && strcmp(w1,w2) == 0)
{   
    c1 = fgets(l1,1024,fp1);
    c2 = fgets(l2,1024,fp2);
    sscanf(w1,"%1023s",l1);
    sscanf(w1,"%1023s",l1);
    if(c1 != NULL && c2 == NULL)
    {
        printf("EOF 2");
        return 0;
    }
    if(c1 == NULL && c2 != NULL)
    {
        printf("EOF 1");
        return 0;
    }

}
if(strcmp(w1,w2) == 0)
{
    printf("\nfiles are equal");
    return 0;
}
else
{
    printf("\nfiles different");
    return 1;
}
return 0;

}

どうもありがとうございました!

4

1 に答える 1

1

問題の 1 つは、sscanf()議論が前後にあることです。またはからスキャンし、 または に代入する必要がありますがl1l2現時点w1w2は、 または をスキャンして結果を またはw1w2保存します。l1l2

行を反復処理する%nには、バッファ (入力) 内のオフセットを表示するあまり知られていない形式を使用する必要があります。

char *c1;
char *c2;

while ((c1 = fgets(l1, 1024, fp1)),
       (c2 = fgets(l2, 1024, fp2)),
       c1 != NULL && c2 != NULL)
{
    int n1;
    int n2;

    char *line1 = l1;
    char *line2 = l2;

    int r1;
    int r2;
    while ((r1 = sscanf(line1, "%1023s%n", w1, &n1)),
           (r2 = sscanf(line2, "%1023s%n", w2, &n2)),
           r1 == 1 && r2 == 1)
    {
        if (strcmp(w1, w2) != 0)
            ...lines differ...
        line1 += n1;
        line2 += n2;
    }
    ...deal with r1 or r2 is zero while the other isn't...
}
...deal with c1 or c2 is null while the other isn't...

2 つのループ条件のようにコンマ演算子を使用する理由はありませんでしたが、このコンテキストには適しているようです。fgets()最初の操作が失敗した場合でも、両方の操作を実行したい。同様にsscanf()、最初の操作が失敗した場合でも、両方の操作が実行されるようにします。このコードは、関数呼び出しを繰り返さずにそれを実現します。

1 行から複数​​の単語を読み取るための重要なポイントはline1 += n1;、次のスキャンの開始位置に文字列変換が終了したオフセットを追加する構成です。

于 2013-11-04T06:51:23.827 に答える