为什么我不能scanf()两个不同的文件并在一段时间内同时获得输入?

时间:2012-12-11 09:55:58

标签: c file text scanf

会发生什么,它首先从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;
}

5 个答案:

答案 0 :(得分:6)

你的声明是短路的。使用OR(||)运算符时,如果第一个表达式为true,则第二个表达式不会被执行。

我不完全确定你想用OR(||)运算符实现什么,也许你真的需要一个AND(&&)?

答案 1 :(得分:5)

您使用了||运算符,因此只有一个fscanf调用成功。这也意味着buf1buf2变量中只有一个具有有效值。

如果您想从两个文件中读取数据,请改用&&运算符:

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

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

答案 2 :(得分:1)

正是因为这个

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

以上是或声明。因此,如果第一个成功,第二个就不会被评估。

答案 3 :(得分:0)

执行此行时:

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

如果||运算符的左侧子表达式求值为true(第一个文件中的fscanf为OK),则其他子表达式(fscanf(fp2,"%c",&buf2) == 1)将根本不执行,因此您只能读取第一档。

答案 4 :(得分:0)

使用逻辑OR运算符时:

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

您的代码变为:

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

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

所以你使用逻辑AND运算符:

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

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

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

另外,在处理EOFbuf1之前,请考虑在while循环中添加buf2