在C中逐字符比较文本文件

在C中逐字符比较文本文件,c,io,char,C,Io,Char,我正在编写一个小程序,其功能如下: 执行时,接受两个文本文件作为参数。 逐个字符比较每个文本文件,向用户显示每个比较是否成功。 当同一位置的两个字符不相同时,会将此信息告知用户,然后程序结束。 如果两个文本文件完全相同,也会告诉用户,程序结束 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) // define main procedure, taking an command

我正在编写一个小程序,其功能如下: 执行时,接受两个文本文件作为参数。 逐个字符比较每个文本文件,向用户显示每个比较是否成功。 当同一位置的两个字符不相同时,会将此信息告知用户,然后程序结束。 如果两个文本文件完全相同,也会告诉用户,程序结束

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

int main(int argc, char *argv[]) // define main procedure, taking an command line argument
{
    int ch, ch2; // index for current character
    FILE *fp; // pointer to file
    FILE *fp2;
    unsigned long count = 0;

if (argc != 3) //
{
    printf("Usage: %s filename \n", argv[0]);
    exit(EXIT_FAILURE);
}

if ((fp = fopen(argv[1], "r")) == NULL) // check for 'cannot open' error in first file
{
    printf("Can't open %s\n", argv[1]);
    exit(EXIT_FAILURE);
}
else if ((fp2 = fopen(argv[2], "r")) == NULL) // check for 'cannot open' error in second file
{
        printf("Can't open %s\n", argv[2]);
        exit(EXIT_FAILURE);
}

while ((ch = getc(fp) != EOF) || (ch2 = getc(fp2) != EOF)) // while both files still have characters remaining
{
    printf("\n %d %d \n", ch, ch2); // print both characters (debugging purposes)
    if (ch == ch2) // if two characters are same at current position
    {
        printf("FILES ARE SAME AT POSITION %d", count); // report to user
        count++; // increase count
    }
    else
    {
        printf("FILES ARE NOT NOT NOT SAME AT POSITION %d", count); // report that files are not same at current position
        fclose(fp); // close files
        fclose(fp2);
        exit(EXIT_FAILURE); // exit
    }
}

fclose(fp);
fclose(fp2);
printf("FILES ARE THE SAME THROUGHOUT!");

return 0;
但是,程序在比较时会显示文件中没有的随机字符,从而导致无限循环和错误执行


是我的文件指针不正确,还是我把某个数据类型搞砸了,导致了这种情况?

考虑一下paren在代码中的位置:

if ((fp = fopen(argv[1], "r")) == NULL)
while ((ch = getc(fp) != EOF) || (ch2 = getc(fp2) != EOF))
现在仔细看看,比较一下paren在代码中的位置:

if ((fp = fopen(argv[1], "r")) == NULL)
while ((ch = getc(fp) != EOF) || (ch2 = getc(fp2) != EOF))
你注意到有什么不一致吗?也许你是想写这个:

while ((ch = getc(fp)) != EOF || (ch2 = getc(fp2)) != EOF)

你的程序还有一个问题。在打印文件中,位置%d处的文件相同,计数;您告诉printf打印一个由count表示的int,但count不是int。。。您应该将%lu用于无符号长值。

首先,您应该将while循环从

while ((ch = getc(fp) != EOF) || (ch2 = getc(fp2) != EOF))


作为!=优先级高于=,您的while循环始终存在问题

您需要在调试器中运行程序并在不同点检查变量…我不知道它是否相关,但您可能希望像这样修复while。而ch=getcfp!=EOF&&ch2=getcfp2!=EOFI我非常确定您的while条件必须与&&相连接,否则只要其中一个文件尚未达到eof,它就会读取这两个文件。@pfannkuchen\u gesicht我非常确定这就是目的。。。您必须阅读while循环的测试条件以外的内容才能了解原因;但这将导致垃圾被打印出来。