【问题标题】:Why cant I fscanf() two different files and get input at the same time, inside a while condition?为什么我不能 fscanf() 两个不同的文件并在一段时间内同时获取输入?
【发布时间】:2012-11-28 20:29:05
【问题描述】:

发生的情况是它首先从 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;
}

【问题讨论】:

  • 是的,你可以这样做。您必须使用线程或并发编程。你不能像现在这样在顺序编程方法中做到这一点。
  • @askmish,我想你错过了他的实际问题。该解决方案不需要线程。
  • 是的,OP最近对问题进行了一些编辑。

标签: c file text scanf


【解决方案1】:

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

如果您想同时读取这两个文件,请改用&amp;&amp; 运算符:

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

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

【讨论】:

  • 应该提到的是,需要在程序中增加一点复杂性才能正确处理文件大小不同的情况。
  • @MichaelBurr:我刚刚将其添加到我的答案中。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    正因为如此

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

    以上是一个or语句。因此,如果第一个成功,则不会评估第二个。

    【讨论】:

      【解决方案4】:

      当这行被执行时:

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

      如果|| 运算符的左侧子表达式的计算结果为真(第一个文件中的 fscanf 可以),则另一个子表达式 (fscanf(fp2,"%c",&amp;buf2) == 1) 根本不会执行,因此您只能从第一个文件中读取。

      【讨论】:

        【解决方案5】:

        当您使用逻辑 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 检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-16
          • 2023-01-10
          • 1970-01-01
          • 2015-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多