Код OP требует нескольких исправлений.
Возвращаемое значение
Такие функции, как fread()
, возвращают полезную информацию.Используй их.В этом случае он говорит, сколько было прочитано. @ Флюгер
"% s" ожидает строку указатель
printf("content of 81.txt %s \n", fp1_content);
ожидает fp1_content
является строка .В C string всегда имеет нулевой символ , иначе это не строка.Чтобы напечатать текст, который может не иметь '\0'
, используйте "%.*s"
, который принимает аргумент для ограничения длины печати."%s"
с нестроковым значением неопределенное поведение .Неожиданные вещи могут случиться. @ Tom Karzes
Сравните ненулевые строки с memcmp()
Ненужный код
char ch1 = getc(fp1);
не нужно определять конец, используйте возвращаемое значение fread()
. @ Жан-Франсуа Фабр В сторону: используйте int ch1
, чтобы отличить 257 различных возвращаемых значений от fgets()
.
Избегайте обнаженных магических чисел
Вместо того, чтобы засорять код 10
здесь и там, используйте именованную константу.
Думайте масштабно
Файлы могут быть больше, чем INT_MAX
блоков.Предложить long long eqBlocks
.
#include <limits.h>
#define COMPAREFILES_N 10
#if COMPAREFILES_N > INT_MAX
#error Use smaller block
#endif
void compareFiles(FILE *fp1, FILE *fp2) {
char fp1_content[COMPAREFILES_N];
char fp2_content[COMPAREFILES_N];
long long eqBlocks = 0;
for (;;) {
size_t len1 = fread(fp1_content, COMPAREFILES_N, 1, fp1);
size_t len2 = fread(fp2_content, COMPAREFILES_N, 1, fp2);
if (len1 < 1 || len2 < 1) {
break; // failed to read a block in each file
}
if (memcmp(fp1_content, fp2_content, COMPAREFILES_N) == 0) {
eqBlocks++;
printf("Common content `%.*s`\n", COMPAREFILES_N, fp1_content);
}
}
printf("Nb of identical blocks: %lld\n", eqBlocks);
}