Когда сомневаешься, я обычно полагаюсь на того, кто делал это раньше. Почтенная программа diff существует всегда и делает то, что вы хотите. Кроме того, это открытый исходный код, поэтому зайдите на ftp: //mirrors.kernel.org/gnu/diffutils/diffutils-3.0.tar.gz и проверьте его.
После того, как вы распакуете архив, откройте файл src / analysis.c. Функция diff_2_files
начинается со строки 472. Код, который выполняет фактическое сравнение, запускается из строк 512 - 537. Они воспроизводятся ниже:
for (;; cmp->file[0].buffered = cmp->file[1].buffered = 0)
{
/* Read a buffer's worth from both files. */
for (f = 0; f < 2; f++)
if (0 <= cmp->file[f].desc)
file_block_read (&cmp->file[f],
buffer_size - cmp->file[f].buffered);
/* If the buffers differ, the files differ. */
if (cmp->file[0].buffered != cmp->file[1].buffered
|| memcmp (cmp->file[0].buffer,
cmp->file[1].buffer,
cmp->file[0].buffered))
{
changes = 1;
break;
}
/* If we reach end of file, the files are the same. */
if (cmp->file[0].buffered != buffer_size)
{
changes = 0;
break;
}
}
Идея состоит в том, чтобы загрузить два буфера одинакового размера, а затем загрузить каждый файл в буфер. Сравните два файла по одному буферу за раз, используя memcmp
, и посмотрите, отличается ли какой-либо буфер от другого. Если какое-либо сравнение буферов не возвращает равных, тогда эти два файла различны. Также важно отметить, что вам никогда не нужно считывать больше двух буферов данных за раз, поэтому этот подход работает и с большими файлами.