我如何逐个字符地比较两个文件

时间:2011-06-26 20:50:12

标签: c

我正在编写一个程序,逐个字符地比较两个文件。比较每个文件的函数返回一个值,该值取决于文件的条件。

当两个文件相同时,函数返回0,如果两个文件匹配但是第一个文件在第二个文件之前结束,则返回-1;如果两个文件匹配但是第二个文件在第一个文件之前结束,则返回-2,并且正int指示哪个文件文件不同的字符。

#include <stdio.h>
#include <string.h>
#define CMP_EQUAL 0
#define CMP_EOF_FIRST -1
#define CMP_EOF_SECOND -2

int char_cmp(FILE *fp1, FILE *fp2);

int main(void)
{
    FILE *fp1;
    FILE *fp2;

    fp1 = fopen("input1.txt", "rb+");
    fp2 = fopen("input2.txt", "rb+");

    switch(char_cmp(fp1, fp2))
    {
        case CMP_EQUAL:
            printf("The Files are equal");
            break;
        case CMP_EOF_FIRST:
            printf("EOF on a.txt");
            break;
        case CMP_EOF_SECOND:
            printf("EOF on t.txt");
            break;
        default:
            printf("files differ: char %d\n", char_cmp(fp1, fp2));
            break;
    }

    if(fclose(fp1) != 0)
    {
        perror("fclose");
        /*other error handling*/
    }

    if(fclose(fp2) != 0)
    {
        perror("fclose");
        /*other error handling*/
    }

    return 0;
}

int char_cmp(FILE *fp1, FILE *fp2)
{
    int c, d;
    size_t byte = 0;
    int same = 1;

    do
    {
        byte++;
    }while((c = fgetc(fp1)) == (d = fgetc(fp2)));

    if(c == EOF && d != EOF)
    {
        return CMP_EOF_FIRST;
    }

    if(d == EOF && c != EOF)
    {
        return CMP_EOF_SECOND;
    }

    if(c != d)
    {
        return byte;
    }

    return CMP_EQUAL;
}

我想知道在检查每个文件中的所有字符是否匹配之后我将如何突破do循环。因为当我尝试过时,它会在发现一个相同的字符并且不检查剩下的字符时打破它。

此外,我也鼓励这个奇怪的错误,如果一个文件包含:

dee

,第二个包含

ae

它给了我一个奇怪的回报值,并想知道为什么会这样呢?

感谢您提前提供任何帮助

3 个答案:

答案 0 :(得分:3)

您多次致电char_cmp()。第二轮,在printf()调用中,返回与第一次调用不同的值,因为已经使用了文件指针。

调用char_cmp()一次,并将返回的值存储在本地。

cmp = char_cmp(fp1, fp2);
switch(cmp)
{
case CMP_EQUAL:
    printf("The Files are equal");
    break;
case CMP_EOF_FIRST:
    printf("EOF on a.txt");
    break;
case CMP_EOF_SECOND:
    printf("EOF on t.txt");
    break;
default:
    printf("files differ: char %d\n", cmp);
    break;
}

我不知道你的逻辑的其余部分是否正确。


实际上,你的逻辑不正确。当呈现相同的文件时,它进入无限循环。我相信你能够找到问题所在!

答案 1 :(得分:3)

您调用char_cmp(fp1, fp2))两次 - 一次在switch语句中,第二次在默认情况下。第二次它返回它们不同的第二个char位置(或另一个,非常意外:) 将其更改为

int k = char_cmp(fp1, fp2));

并在这两个地方使用k:

switch( k )
...
printf("files differ: char %d\n", k);

编辑:在发生相同文件的情况下发生无限循环,因为在这种情况下:

(c = fgetc(fp1)) == (d = fgetc(fp2))
从某个时刻开始,

cd永远等于EOF。将其更改为

(c = fgetc(fp1)) == (d = fgetc(fp2) && c != EOF

一切都很好。

答案 2 :(得分:2)

当两者同时达到EOF时,while条件为真,你开始反复循环,因为EOF == EOF。

我建议你尽量减少“短暂”。