На мой взгляд, fread и fwrite просто добавляют слой путаницы.
Попробуйте вместо этого использовать байтово-ориентированные функции ввода и вывода, поскольку 4-байтовые чанки не намного лучше, чем вообще не используют чанки, и вы не можете делать ошибки в коде, который не пишете.
int ch;
while ((ch = getc(inputFile)) != EOF)
putchar(ch);
Но я думаю, что реальная проблема здесь в том, что вы, возможно, не совсем понимаете, о чем вы просите. Вы читаете двоичные данные, а затем пытаетесь распечатать их как символьные данные; многие произвольные байтовые значения не соответствуют каким-либо печатным символам. Что вы ожидаете увидеть для этих байтов?
Более информативным подходом может быть распечатка целочисленного значения каждого байта, а также символа, который он представляет. Это позволит вам ясно видеть, когда в вашем файле есть непечатаемые символы.
например,
void func(FILE *s)
{
int ch;
while ( (ch = getc(s)) != EOF )
printf("%d -> %c\n", ch, ch);
}
Когда я запускаю этот фрагмент программы для файла, содержащего один из каждого байта, становится ясно, что многие значения не имеют смысла при интерпретации как символа:
[snip...]
29 ->
30 ->
31 ->
32 ->
33 -> !
34 -> "
35 -> #
36 -> $
37 -> %
38 -> &
39 -> '
[...more snipping]