Вспоминаем Си. Чтение и запись файла

Смешно, сам от себя такого не ожидал.

#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");

Открывайте файлы в бинарном режиме.

Запись опубликована в рубрике Новости с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий