2012-12-11 25 views
2

发生什么事是它首先获得来自fp1的所有输入,然后从fp2获取输入。为什么是这样?你不能在while语句中同时从2个不同的文件指针获取输入吗?为什么不能我fscanf()两个不同的文件,并在一段时间内同时获得输入?

/*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; 
} 
+0

是的,你可以做到这一点。你必须使用线程或并发编程。你不能像目前正在进行的顺序编程方法那样做。 – askmish

+3

@askmish,我想你错过了他的实际问题。该解决方案不需要线程。 –

+0

是的,OP最近在这个问题上做了一些编辑。 – askmish

回答

6

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

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

5

您使用的||运营商,因此只有fscanf调用一个会成功。这也意味着只有其中一个buf1buf2变量将具有有效值。

如果你想从两个文件读取,使用&&操盘手:

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

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

+1

应该指出的是,为了正确处理文件大小不一致的情况,需要在程序中增加一点复杂性。 –

+0

@MichaelBurr:我只是将其添加到我的答案中。 – interjay

1

正是因为这个

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

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

0

当执行这一行:

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

如果||运营商的左侧子表达式的计算结果为真(的fscanf从第一个文件是OK),其他的子表达式(fscanf(fp2,"%c",&buf2) == 1)将不会执行在所有,所以你只能从第一个文件中读取。

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()

在处理buf1buf2之前,还应考虑在while循环中检查EOF

相关问题