Смешно, сам от себя такого не ожидал.
#include <windows.h> #include <stdio.h> #define CHUNK 1024 int copy(FILE *src, FILE *dst) { int bytes; unsigned char buf[CHUNK]; do { // копируем весь файл кусками по 1 Кбайт bytes = fread(buf, 1, CHUNK, src); fwrite(buf, 1, bytes, dst); } while (!feof(src)); return 0; } int main() { FILE *in, *out; fopen_s(&in, "test_in.bin", "r"); fopen_s(&out, "test_out.bin", "w"); copy(in, out); fclose(in); fclose(out); return 0; }
Сидел, гадал, в чем проблема, оказалось — в генах :)
Вся разгадка проста, по умолчанию функция fopen() (устарела, вместо нее надо использовать fopen_s(), что и было сделано), открывается файлы в текстовом режиме. А мы копируем бинарные файлы и получаем абсолютно неверный результат. Встречая на своем пути код 0x1Ah / 26d, функция чтения fread() отмечает, что прочитан весь файл и заканчивает отдавать содержимое файла.
Так сказать diff patch выглядит так:
fopen_s(&in, "test_in.bin", "rb"); fopen_s(&out, "test_out.bin", "wb");
Открывайте файлы в бинарном режиме.