Первый совет, используйте заголовок cstdint, если хотите работать с типами гарантированного размера. Такие типы, как uint16_t
, являются стандартными и существуют не просто так.
Далее, идея записи иногда двух байтов, а иногда записи четырех. Имейте в виду, что когда вы записываете данные в такой файл, он будет выглядеть как большой кусок данных. Не будет никакого способа волшебным образом узнать, когда читать два байта, а когда четыре. Вы можете хранить метаданные о файле, но это, вероятно, будет более неэффективно, чем просто последовательное использование одного и того же размера. Пишите все как два байта или четыре байта. Это зависит от вас, но что бы это ни было, вы, вероятно, должны придерживаться этого.
Теперь перейдем к тому, почему у вас записано 28 байт данных.
Вы пишете ASCII-представление своих чисел. В итоге получается "120 98 99 99 98 257 259 98 9"
размером 28 байт.
При записи ваших данных вы, вероятно, захотите сделать что-то вроде
out.write( (char*)&my_data, sizeof(my_data));
Имейте в виду, что это не совсем безопасный способ записи двоичных данных. Я думаю, вы уже понимаете необходимость убедиться, что вы пишете нужный размер. К сожалению, сложности с созданием переносимых файлов на этом не заканчиваются. Вам также нужно побеспокоиться о порядке байтов машины, на которой работает ваша программа. Это статья, которую, я думаю, вам может быть интересно прочитать, чтобы узнать больше об этом предмете.
Учебник Disch по хорошим двоичным файлам
person
Austin Jenkins
schedule
11.12.2016
int
не гарантированно будет 4 байта, аshort
не гарантированно будет 2 байта. Большинство компиляторов используют эти размеры, но стандарт их не навязывает. - person UnholySheep   schedule 11.12.2016binary
не означает, что вывод будет двоичным. Это просто означает, что окончания строк не будут затронуты. Это должен быть дубликат. - person Martin Bonner supports Monica   schedule 11.12.2016