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