Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我不能在一段时间内同时获取两个不同的文件和输入?_C_File_Text_Scanf - Fatal编程技术网

C 为什么我不能在一段时间内同时获取两个不同的文件和输入?

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

它首先从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 = 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:我刚刚在回答中添加了这一点。