Сравнение файлов с C

#c #file

#c #файл

Вопрос:

Я пытаюсь написать код, который сравнивает два файла и показывает, равны они или нет

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

int main(){
    
    FILE *f1, *f2;
    int diff = 0;
    char c1, c2, name_f1[100], name_f2[100];

    printf("File1: ");
    fgets(name_f1, 100, stdin);

    printf("File2: ");
    fgets(name_f2, 100, stdin);

    f1 = fopen(name_f1, "r ");
    f2 = fopen(name_f2, "r ");
    
    do{
        c1 = fgetc(f1);
        c2 = fgetc(f2);

        if (c1 != c2){
            diff = 1;
        }
    }while(c1 != EOF amp;amp; c2 != EOF);

    fclose(f1);
    fclose(f2);

    if(diff==1){
        printf("Files are different");
    }else{
        printf("Files are the same");
    }

    return 0;
}

 

Но он продолжает говорить мне, что они одинаковы, даже если это не так, и я понятия не имею, почему
Кроме того, если fopen предназначен только для чтения («r»), он возвращает ошибку сегментации, что я также понятия не имею, почему это происходит

Любая помощь приветствуется, спасибо.

Комментарии:

1. Возможно, первая часть файлов идентична? Если вы нажмете один EOF перед другим, они будут иметь разные размеры и по определению не совпадают. Вы также можете проверить это заранее и в этом случае избежать цикла. Кроме того, это не связано с вашей проблемой, вы можете выйти из цикла, как только увидите разницу.

2. Всегда , действительно всегда проверяйте, не происходит ли fopen сбой. Нет абсолютно никакого оправдания тому, чтобы не делать этого.

3. Возможно, вы захотите изучить для вдохновения исходный код GNU diffutils . Вам необходимо прочитать документацию вашего компилятора C (например, GCC …) и отладчика (например, GDB …)

Ответ №1:

поведение, которое вы описываете, может указывать на то, что файлы, которые вы пытаетесь открыть, не существуют, поскольку «r» возвращает null, если файл не существует, но «r » создает file * , это, похоже, объясняет ошибку ошибки сегментации.
поэтому также разумно, что ваша программа возвращаетфайлы идентичны, поскольку оба созданных файла будут пустыми. возможно, ваш путь неверен?

Совет: всегда проверяйте fopen успех и завершайте работу при сбое

* как видно здесь: https://www.geeksforgeeks.org/file-opening-modesr-versus-r /