Как сравнить два файла символ за символом - PullRequest
1 голос
/ 27 июня 2011

Я пишу программу, которая сравнивает два файла символ за символом.Функция сравнения каждого файла возвращает значение, зависящее от состояния файлов.

функция возвращает 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 ]

3 голосов
/ 27 июня 2011

Вы вызываете 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))

c и d с некоторого момента навсегда становятся равными EOF.Измените это на

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

и все в порядке.

3 голосов
/ 27 июня 2011

Вы звоните 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;
}

Я не знаю, верна ли ваша логика или нет.


На самом деле ваша логика неверна.Он входит в бесконечный цикл, когда представлен одинаковыми файлами.Я уверен, что вы сможете отследить проблему!

2 голосов
/ 27 июня 2011

Когда оба достигают EOF в одно и то же время, условие while выполняется, и вы начинаете цикл снова и снова, так как EOF == EOF.

Я предлагаю вам попытаться быть менее «коротким» вначало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...