如何比较两个文件并显示C中的所有差异?

时间:2015-05-20 19:17:36

标签: c file compare diff

我目前正在尝试制作一个比较2个文件并显示所有差异的程序。

我遇到的问题是:

  • 结果的第一行没有显示第一个字符。

  • 差异没有正确的结果。

我有两个输入文件。

file.txt的

AAA
BBB
CCC
DDD
EEE

FILE2.TXT

AAA
111
BBB
222
333
CCC
DDD
EEE
444

输出(第1行被窃听)我得到的是:

11
BBB
222
333
CCC

我希望获得的输出(没有第一行错误)必须是:

111
222
333
444

这是我目前的代码:

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

int compare(char *fname1, char *fname2)
{
    FILE *fp1 = fopen(fname1, "r"); 
    FILE *fp2 = fopen(fname2, "r");
    int ch1, ch2;

    if (fp1 == NULL) 
    {
        printf("Can't open %s", fname1);
        exit(1);
    } 
    else if (fp2 == NULL)
    {
        printf("Can't open %s", fname2);
        exit(1);
    } 
    else
    {
        ch1 = getc(fp1);    
        ch2 = getc(fp2);

        while ((ch1 != EOF) && (ch2 != EOF) && (ch1 == ch2)) 
        {
            ch1 = getc(fp1);
            ch2 = getc(fp2);
        }

        if (ch1 == ch2)
        {
            printf("Same. \n");
        }
        else if (ch1 != ch2)
        {
            printf("Different strings:\n");

            while(!feof(fp1) && !feof(fp2))
            {
                fgets(fname1, ch1, fp1);
                fgets(fname2, ch2, fp2);

                if(strcmp(fname1, fname2) != 0)
                {
                    printf("%s", fname2);
                }
            }
        }
    }

    fclose(fp1);
    fclose(fp2);
    return 0;
}

主要功能:

int main(int argc, char *argv[])
{
    if (argc == 3){
        compare(argv[1], argv[2]);
    }else{
        printf("Usage: ./what file.txt file2.txt \n");
    }
    return 0;
}

比较file.txt和file2.txt或file2.txt和file.txt会得到相同的结果。

2 个答案:

答案 0 :(得分:0)

你缺少的第一个字符在第一个循环中被getc()消化。要解决这个问题,请尝试仅使用第二个while()或在开始下一个while()循环之前找回一个char

答案 1 :(得分:0)

您对fgets()的两次通话都是错误的。根据{{​​3}}:

  

char * fgets(char * str,int num,FILE * stream);

     

str :指向复制字符串读取的字符数组的指针。

     

num :要复制到str的最大字符数(包括   终止空字符)。

     

stream :指向FILE对象的指针   标识输入流。 stdin可以用作参数来读取   标准输入。

尝试写入你的程序argv[]可能不会很好。至少你想要做的事情是:

char string1[100];
char string2[100];

fgets(string1, 99, fp1);
fgets(string2, 99, fp2);

使用feof()这样的fgets() documentation可能是错误的。

至于你的比较问题...尝试进行文件比较并检查添加/删除的字符串不是一个简单的问题。您可以从be aware开始获取某些背景信息。