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 ( ||) 运算符时,如果第一个表达式为真,则不会执行第二个表达式。

我不完全确定您要使用 OR ( ||) 运算符实现什么,也许您实际上需要 AND ( &&)?

于 2012-12-11T09:59:51.423 回答
5

您使用了||接线员,因此只有一个fscanf呼叫会成功。这也意味着只有一个buf1,buf2变量将具有有效值。

如果要从两个文件中读取,请改用&&运算符:

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

请注意,即使一个文件比另一个文件长,您的代码也可能认为这两个文件相同。为了防止这种情况,您需要检查两个fscanf调用是否同时失败。

于 2012-12-11T09:59:44.573 回答
1

正因为如此

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

以上是或陈述。因此,如果第一个成功,则不会评估第二个。

于 2012-12-11T10:00:07.510 回答
0

执行此行时:

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

如果运算符的左侧子表达式||计算结果为真(第一个文件中的 fscanf 正常),则另一个子表达式 ( 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 )

请注意,您每次使用时都在读取单个字符fscanf(),因此如果成功,总是fscanf()会返回 1,因此永远不会进入第二个评估表达式。因此,在它完成读取文件fp1之前,它将跳过读取第二部分。一旦fscanf()for 开始失败fp1,这将导致第一个表达式计算为false,然后它将开始读取buf2直到fp2完成。

因此,您使用逻辑 AND 运算符:

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

这确保两者buf1buf2都填充了正确的值,然后while才会处理循环。

注意:对于您的应用程序,您也可以考虑使用fgetc()代替fscanf().

EOF还可以考虑在处理之前在 while 循环中添加检查buf1buf2.

于 2012-12-11T10:13:07.717 回答