Почему printf не рассматривает буфер как символьную строку в случае двоичных файлов?
printf("%s",buffer)
предполагает , что buffer
содержит строку C. Проблема в том, что это не то, что на самом деле содержит buffer
. Ваш buffer
фактически содержит байты из двоичного файла.
Строка C заканчивается первым нулевым байтом (a.k.a., '\ 0', a.k.a., ASCII NUL), и произвольный нетекстовый файл (a.k.a., "двоичный файл") может содержать ноль байтов в любом месте внутри себя. Формат printf "% s" остановится, как только увидит первый нулевой байт.
Почему printf в функции traverse ставит тарабарщину вместо символов?
Этот "бред" составляет символов. Но символы ничего не значат, потому что файл, который вы пытаетесь интерпретировать как последовательность символов, не должен интерпретироваться таким образом.
Текстовый файл - это последовательность байтов, которые должны отображаться в соответствии с некоторой кодировкой символов и которые обычно предназначены для передачи некоторого вида человекочитаемой информации. Произвольный «двоичный» файл, вероятно, содержит последовательность байтов, которые не должны представлять читаемый человеком текст. Они представляют собой нечто другое, что понимает какая-то компьютерная программа.
printf "%s"
пытается отобразить эти байты в соответствии с какой-либо системой кодировки символов (часто либо UTF-8 или US-ASCII ), но (а) он не всегда сможет это сделать, и (б) даже когда он способен сделать это, последовательность символов ничего не будет значить.