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

标签 c

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

当两个文件相同时函数返回 0,如果两个文件匹配但第一个文件在第二个文件之前结束则返回 -1,如果两个文件匹配但第二个文件在第一个文件之前结束则返回 -2,以及一个正整数表示哪个文件不同的字符。

#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

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

提前感谢您的帮助

最佳答案

您调用 char_cmp(fp1, fp2)) 两次 - 一次在 switch 语句中,第二次在默认条件下。第二次它会返回它们不同的第二个字符位置(或其他,真的出乎意料:)
将其更改为

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

一切正常

关于c - 我如何逐个字符地比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486658/

相关文章:

c++ - 有条件的大型平面数组遍历和令人惊讶的短循环执行时间

c - 在C中交换动态二维数组的行

c - C中允许的主要函数形式有哪些

c - opencv for c gtk 警告无法打开显示

c - 用汇编语言解释这一行?

c - CPU的舍入模式什么时候可以改变?

c - 使用系统ECHO命令在C语言中打印二维数组

c - 重复的 udp 数据包 : how often it happens?

C排序改变数组中的值

c - 指针问题,数组第二个位置与另一个数组中的第一个位置相同