У меня есть двоичный файл с некоторым расположением, которое я знаю. Например, пусть формат будет таким:
- 2 байта (unsigned short) - длина строки
- 5 байтов (5 х символов) - строка - некоторое имя id
- 4 байта (unsigned int) - шаг
- 24 байта (6 x float - 2 шага по 3 поплавки) - данные с плавающей запятой
Файл должен выглядеть (я добавил пробелы для чтения):
5 hello 3 0.0 0.1 0.2 -0.3 -0.4 -0.5
Здесь 5 - это 2 байта: 0x05 0x00. "привет" - 5 байт и т.д.
Теперь я хочу прочитать этот файл. В настоящее время я делаю это так:
- загрузите файл в ifstream
- прочитайте этот поток до
char buffer[2]
- переведите его в unsigned short:
unsigned short len{ *((unsigned short*)buffer) };
. Теперь у меня длина строки. - прочитайте поток до
vector<char>
и создайтеstd::string
из этого вектора. Теперь у меня есть идентификатор строки. - таким же образом прочитайте следующие 4 байта и переведите их в unsigned int. Теперь у меня есть шаг.
- в то время как конец файла не читает float одинаково - создайте
char bufferFloat[4]
и нарисуйте*((float*)bufferFloat)
для каждого поплавка.
Это работает, но для меня это выглядит уродливо. Можно ли читать непосредственно unsigned short
или float
или string
и т.д. Без создания char [x]
? Если нет, то каков способ правильной работы (я читаю, что стиль, который я использую, - это старый стиль)?
P.S.: пока я писал вопрос, более ясное объяснение, поднятое в моей голове, - как произвольное количество байтов от произвольной позиции в char [x]
?
Обновление: я забыл явно указать, что длина строки и длины плавающего файла неизвестна во время компиляции и является переменной.