Возможно, у вашего класса, который содержит все данные, есть статическая функция, которая создает объект с учетом вашей сериализованной строки. Как это работает в зависимости от ваших данных. Вы говорите, что определили смещения для полей, но также говорите, что они разделены. Это создает проблему, так как оба должны обрабатываться по-разному.
Простой пример для вашего примера:
class DataContainer
{
using namespace std; // FIXME Is this legal?
public:
DataContainer(string part1, string part2, string part3, string part4, string part5) :
m_part1(part1), m_part2(part2), m_part3(part3), m_part4(part4), m_part5(part5)
{
}
static DataContainer readFromStream(istream &stream)
{
DataContainer ret;
char tmp[16];
stream.get(tmp, 4);
ret.m_part1 = string(tmp, 4);
stream.get(tmp, 4);
ret.m_part2 = string(tmp, 4);
stream.get(tmp, 3);
ret.m_part3 = string(tmp, 3);
stream.get(tmp, 4);
ret.m_part4 = string(tmp, 4);
stream.get(tmp, 3);
ret.m_part5 = string(tmp, 3);
return ret;
}
private:
DataContainer()
{
}
string m_part1, m_part2, m_part3, m_part4, m_part5; // Put these in an array if they belong in an array.
};
Примечание. Я добавил все свои функции. Вы, вероятно, должны поместить свои функции в их собственный файл .cpp.
Используйте это так:
DataContainer dc = DataContainer::readFromStream(std::cin);
Это читает ваши данные из cin
(stdin
) и помещает структуру данных в dc
.
Если у вас уже есть считанные данные, вы можете довольно легко использовать итераторы STL (которые в основном являются указателями на элементы контейнера). Вы также можете использовать классическую индексацию, которая проще для вашего конкретного случая. Например:
static DataContainer readFromBuffer(string buffer)
{
DataContainer ret;
ret.m_part1 = string(buffer, 0, 4);
ret.m_part2 = string(buffer, 4, 4);
ret.m_part3 = string(buffer, 8, 3);
ret.m_part4 = string(buffer, 11, 4);
ret.m_part5 = string(buffer, 15, 3);
return ret;
}