Проблема в вашем std::cout
выражении вывода. Когда вы пытаетесь вывести blocks[0].data
, operator<<
получает не массив из 32 символов, а указатель на первый символ. Это интерпретируется как указатель на строку C, и поэтому выводит все символы, найденные в памяти, оттуда до тех пор, пока не найдет '\0'
. Поскольку каждый элемент массива содержит только соответствующие символы из файла, выводятся все символы файла (если в файле нет '\0'
, то вывод на этом останавливается). Кроме того, вам (не) повезло, что '\0'
следует за вашими данными в памяти, поэтому вывод на этом останавливается (вместо того, чтобы продолжать выводить то, что находится в памяти впоследствии, и, возможно, выдавать ошибку сегментации, когда конец память процесса достигнута).
Чтобы просто вывести 32 символа в виде символов , используйте std::cout.write(blocks[0].data,32)
. В противном случае, чтобы вывести их как целые, просто переберите их и конвертируйте каждый в int:
for (int i = 0; i < 32; ++i)
std::cout << static_cast<int>(blocks[0].data[i]) << ' ';
Конечно, вы можете использовать все потоковые манипуляторы для получения чисел в нужной форме (например, std::hex
для шестнадцатеричного вывода и / или std::setw
и std::setfill
для получения чисел фиксированной ширины).