Предполагая, что RType
является типом перечисления с поддержкой char
(или псевдонимом для некоторого типа char
), вы можете memcpy
внести свой вклад в объект record
. Вы также можете заставить ваш компилятор делать то, что вы намереваетесь с помощью reinterpret_cast
.
Однако проблема, с которой вы сталкиваетесь, звучит так, как будто вы наблюдаете значения в этом record
объекте с помощью функций, которые принимают строки с нулевым символом в конце. Вместо этого вы должны использовать функции, которые принимают длину.
printf("r.m_rectype = \"%d\"", r.m_rectype);
printf("r.m_recordname = \"%11.11s\"", r.m_recordname);
printf("r.m_recordNo = \"%d\"", r.m_recordNo);
printf("r.m_record_date = \"%6.6s\"", r.m_record_date);
Я использовал reinterpret_cast
blockquote>
reinterpret_cast
нельзя использовать для этого. Ваше использование имеет неопределенное поведение. Следующее будет хорошо определено:record r; // create a record object std::memcpy(&r, line, sizeof r);
Предостережения:
- Строки не заканчиваются нулем!
- [ 119] Входной буфер не должен быть короче
sizeof(RType)
должно быть 1sizeof r
.
, но вместо этого я получаю следующее
blockquote>r.m_recordname = "Netherlands3240382"
Netherlands3240382
не помещается внутри членаm_recordname
, и поэтому это не может быть возможно быть состоянием объекта. Проблема должна заключаться в том, как генерируется вывод. Я подозреваю, что строка обрабатывается так, как если бы она была завершена нулем, несмотря на то, что это не так.
Строго говоря, Стандарт не дает никаких гарантий относительно заполнения между элементами a struct
, за исключением того, что в начале не будет заполнения. Таким образом, даже если ваша конкретная структура вряд ли будет содержать отступы - будучи (я предполагаю) всеми типами символов, для безопасности вы можете сделать что-то вроде этого: быть очень быстрым, потому что pos_copy
должно быть хорошо встроено.