fwrite печатает мусор в конец файла

Пытаюсь заставить работать следующий код:

if (FILE *fp_in = fopen("filename", "rb"))
{
    if (FILE *fp_out = fopen("filename.1", "wb"))
    {
        unsigned char buff[1024] = {0};
        while (size_t len = fread(buff, 1, sizeof(buff), fp_in))
        {
            unsigned int outLen = 0;  // out param - bytes in сiphertext
            unsigned char *out = foo(buff, len, key, outLen);
            fwrite(out, 1, sizeof(buff), fp_out);
        }
        fclose(fp_out);
    }
    fclose(fp_in);
}
// Обратный процес
if (FILE *fp_in = fopen("filename.1", "rb"))
{
    if (FILE *fp_out = fopen("filename.2", "wb"))
    {
        unsigned char buff[1024] = {0};
        while (size_t len = fread(buff, 1, sizeof(buff), fp_in))
        { 
            unsigned char *out = bar(buff, len, key);
            printf("%s\n", out);
            fwrite(out, 1, sizeof(buff), fp_out);
        }
        fclose(fp_out);
    }
    fclose(fp_in);
}

Файл filename содержит несколько раз повторяющееся слово hello. Далее я читаю содержимое этого файла, обрабатываю и записываю в файл filename1.

Затем произвожу обратный процес. Читаю из filename1 и пишу в filename2. Но я столкнулся с трудностями. В файл filename2 записываются слова hello (в нужном количестве) и затем идет много непонятного мусора (Например �}�D���\��>[��[D����9Ѕ�"K�Ic�)

Но когда я вывожу обработанную информацию (printf строка 26) то все хорошо. Но вот при записи возникает вышеописанная проблема.

P.S. Файлы не обязательно текстовые. Полагается что хранятся бинарные данные


Ответы (1 шт):

Автор решения: Swift

sizeof(buf) тут эквивалентно 1024, а fread мог считать меньше. Для этого и нужно возвращаемое значение числа считанных байт, его следует передавать fwrite. Однако не всегда следует тихо сравнивать его с нулем. Нужно сравнивать заданный и полученный размер, и проверять состояние ошибки. Несоответсвие может означать достижение конца файла или ошибку чтения, или недозаполненный буфер. Чтение может происходить из буферизованного потока, и возврат нуля означает, что буфер пуст, а не то, что достигнут конец файла.

→ Ссылка