#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 /