c - 来自两个不同文件的 fscanf

标签 c scanf chars

在学校的一次作业中,我遇到了一个我无法理解的现象。

我的任务是读取两个文件并检查它们是否完全相同。 我制作了两个包含完全相同行的文本文件:

“ Hello World ”

我决定逐个字符地检查文本。 一开始我写了下面的代码:

编辑:由于许多请求,我重写了要在此处显示的整个代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char c1, c2;
    int ans = 1;
    FILE *f1 = fopen("text1.txt","rt");
    FILE *f2 = fopen("text2.txt","rt");
    for (fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2); 
        !feof(f1) && !feof(f2) && ans; 
        fscanf(f1, "%c", &c1), fscanf(f2, "%c", &c2))
    { // Check Data:
    if (c1 != c2) ans = 0; 
    printf("%c %c\n",c1,c2); // Print side by side check
    } // Check Tail:
    if (!feof(f1)) ans=0;
    if (!feof(f2)) ans=0;

    if (ans) printf("File 1 == File 2");
    else printf("File 1 != File 2");

    return 0;
}

但出于某种原因,代码在 c1 中输入了“H”,在 c2 中输入了“e”。 为什么会这样?

编辑:我似乎无法重现这个问题(这在我参加大学考试时发生在我身上,因此我无法再访问原始代码。大学使用的是过时的 Microsoft Visual Studio 2012,而我使用2015express 版/netbeans)

最佳答案

查看您的代码,我看不到对您记录的行为的解释。您应该发布一个最小的完整可验证示例,以用于查看函数的其余部分。

您的方法不是很有效,并且无法检测到文件不同的某些情况:您测试文件结尾的方式是近似的。

这是使用 getc 的替代方法:

int c1, c2;
int identical = 1;

for (;;) {
    c1 = getc(f1);
    c2 = getc(f2);

    if (c1 != c2) {
        identical = 0;
        break;
    }
    if (c1 == EOF)
        break;
}

编辑:在您发布更多代码后,您得出结论:我似乎无法重现该问题(这发生在我参加大学考试期间,因此我无法再访问原始代码。

我的猜测是您在 for 的初始部分从 f1 扫描了 c1c2循环,一个经典的剪切和粘贴错误。

关于c - 来自两个不同文件的 fscanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34524707/

相关文章:

c# - 字符加扰(C# 和 Javascript)

java - 使用 Java 字符和字符串验证用户输入

c - 确认没有信号的 UDP 数据包?

c - HAL_RCC_OscConfig 耗时太长(约 170 μS),我需要它在从 STOP 唤醒时小于 50 μS

c - 如何在C中通过套接字读取超过256个字节

c - scanf() 第二次进入字符串

c - 仅将字符数组的第一个元素传递给函数 C++

C fork处理全局变量

c - 在以相同模式结尾的文件中搜索整数 block

C: sscanf 问题