2

最初に fp1 からすべての入力を取得し、次に fp2 から入力を取得します。なぜそのようになっているのですか?while ステートメント内で同時に 2 つの異なるファイル ポインターから入力を取得できませんか?

/*checks if 2 text files are identical */
#include <stdio.h>
int main(void)
{
    FILE *fp1,*fp2;
    char buf1,buf2;
    int flag = 1;
    fp1 = fopen("textfile1.txt","r");
    fp2 = fopen("textfile2.txt","r");
    /* putting them inside a while statement causes a logical error? why */
    while(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)
    {
        printf("buf1: %c, buf2: %c\n",buf1,buf2);
        if(buf1 != buf2)
        {
            flag = 0;
            //break;
        }
    }
    if(flag == 1)
        printf("SAME");
    else
        printf("NOT SAME");
    fclose(fp1);
    fclose(fp2);
    return 0;
}
4

5 に答える 5

6

あなたの while ステートメントは短絡的です。OR ( ||) 演算子を使用する場合、最初の式が true の場合、2 番目の式は実行されません。

OR ( ) 演算子で何を達成しようとしているのか完全には||わかりませんが、実際には AND ( &&) が必要なのでしょうか?

于 2012-12-11T09:59:51.423 に答える
5

||演算子を使用したため、fscanf呼び出しの 1 つだけが成功します。buf1これは、buf2変数の 1 つだけが有効な値を持つことも意味します。

両方のファイルから読み取りたい場合は、&&代わりに演算子を使用します。

while (fscanf(fp1,"%c",&buf1) == 1 && fscanf(fp2,"%c",&buf2) == 1)

一方が他方より長い場合でも、コードでは 2 つのファイルが同一であると見なされる場合があることに注意してください。これを防ぐには、2 つのfscanf呼び出しが同時に失敗したことを確認する必要があります。

于 2012-12-11T09:59:44.573 に答える
1

このためです

(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)

上記は or ステートメントです。したがって、最初のものが成功した場合、2 番目は評価されません。

于 2012-12-11T10:00:07.510 に答える
0

この行が実行されると:

while(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)

演算子の左側の部分式が||trueと評価された場合(最初のファイルのfscanfはOK)、他の部分式(fscanf(fp2,"%c",&buf2) == 1)はまったく実行されないため、最初のファイルからのみ読み取ります。

于 2012-12-11T10:00:55.163 に答える
0

論理 OR 演算子を使用する場合:

 while(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)

コードは次のようになります。

 while(fscanf(fp1,"%c",&buf1) ==1 )

を使用して毎回 1 文字を読み取ることに注意してください。したがって、成功した場合はfscanf()常にfscanf()1 が返されるため、2 番目の評価式に進むことはありません。そのため、ファイルの読み取りが完了するまでfp1、2 番目の部分の読み取りはスキップされます。そして、が でfscanf()失敗し始めるfp1と、最初の式が に評価され、が完了するまでfalse読み込みが開始されます。buf2fp2

したがって、論理 AND 演算子を使用します。

 while( (fscanf(fp1,"%c",&buf1) == 1) && (fscanf(fp2,"%c",&buf2) == 1) )

buf1との両方buf2が適切な値で満たされていることを確認してから、whileループが処理されます。

fgetc()注: アプリケーションでは、の代わりに を使用することも検討できますfscanf()

および をEOF処理する前に、while ループにチェックを追加することも検討してください。buf1buf2

于 2012-12-11T10:13:07.717 に答える