C 为什么我不能在一段时间内同时获取两个不同的文件和输入?
它首先从fp1获取所有输入,然后从fp2获取输入。为什么是这样?您不能在while语句中同时从两个不同的文件指针获取输入吗C 为什么我不能在一段时间内同时获取两个不同的文件和输入?,c,file,text,scanf,C,File,Text,Scanf,它首先从fp1获取所有输入,然后从fp2获取输入。为什么是这样?您不能在while语句中同时从两个不同的文件指针获取输入吗 /*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
/*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;
}
/*检查两个文本文件是否相同*/
#包括
内部主(空)
{
文件*fp1,*fp2;
字符buf1,buf2;
int标志=1;
fp1=fopen(“textfile1.txt”,“r”);
fp2=fopen(“textfile2.txt”,“r”);
/*将它们放在while语句中会导致逻辑错误?为什么*/
而(fscanf(fp1、%c、&buf1)==1 | | fscanf(fp2、%c、&buf2)==1)
{
printf(“buf1:%c,buf2:%c\n”,buf1,buf2);
if(buf1!=buf2)
{
flag=0;
//中断;
}
}
如果(标志==1)
printf(“相同”);
其他的
printf(“不相同”);
fclose(fp1);
fclose(fp2);
返回0;
}
您使用了|
操作符,因此只有一个fscanf
调用会成功。这也意味着只有一个buf1
,buf2
变量具有有效值
如果要读取这两个文件,请改用&&
运算符:
while (fscanf(fp1,"%c",&buf1) == 1 && fscanf(fp2,"%c",&buf2) == 1)
<>请注意,即使一个文件比另一个文件长,代码也可以考虑这两个文件相同。为了防止这种情况,您需要检查两个
fscanf
调用是否同时失败。您的while语句正在短路。使用OR(|
)运算符时,如果第一个表达式为true,则第二个表达式不会执行
我不完全确定使用OR(|
)运算符想要实现什么,也许您实际上需要AND(&&
)?正因为如此
(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)
以上是一个or语句。因此,如果第一个成功,则不会对第二个进行计算。执行此行时:
while(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)
如果
|
运算符的左侧子表达式的计算结果为true(来自第一个文件的fscanf是可以的),则另一个子表达式(fscanf(fp2,“%c,&buf2)==1
)将根本不执行,因此您仅从第一个文件读取。使用逻辑OR运算符时:
while(fscanf(fp1,"%c",&buf1) == 1 ||fscanf(fp2,"%c",&buf2) == 1)
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)
while( (fscanf(fp1,"%c",&buf1) == 1) && (fscanf(fp2,"%c",&buf2) == 1) )
确保buf1
和buf2
都填充了正确的值,并且只有在while
循环被处理时,才会执行此操作
注意:对于您的应用程序,您也可以考虑使用<代码> FGCF()<代码>,而不是<代码> fSCANFF()<<代码> >
还考虑添加<代码> EOF检查while循环,在处理<代码> BUF1<代码>和<代码> Buf2。< / P>是的,你可以这样做。您必须使用线程或并发编程。你不能像现在这样用顺序编程的方法来做。@askmish,我想你错过了他的实际问题。这个解决方案不需要线程。是的,OP最近对这个问题做了一些编辑。应该提到的是,要正确处理文件大小不同的情况,程序需要增加一点复杂性。@MichaelBurr:我刚刚在回答中添加了这一点。