2016-12-21 2 views
0

В одном из моих проектов я должен кэшировать позиционную информацию о некоторых фрагментах данных, найденных в больших файлах. Я уже реализовал небольшой API, построенный вокруг std::basic_istream<char>::pos_type, размещенный на картах.Как можно безопасно сериализовать std :: basic_istream <char> :: pos_type?

Теперь мне нужно сериализовать эти дескрипторы в поточный поток и записать их на диск для дальнейшего использования (на других * nix-машинах). Я читал, что этот тип зависит от платформы, но, скорее, является POD-типом. Поэтому я задаю следующие вопросы:

  • Будет ли лучше экономить что-то помимо смещений? Например. std::fpos<std::mbstate_t> Сохранение состояния структуры считывания?
  • Как я могу безопасно получать и восстанавливать данные смещения от std::basic_istream<char>::pos_type (и другая информация, если это необходимо)?

Благодарим вас заранее.

+0

Вы действительно хотите сериализовать внутрисимвольное состояние? Вы действительно используете UTF-8 или аналогичные и, возможно, потребуется сериализовать позицию, которая находится внутри одного символа? –

+0

Нет. Меня интересуют только атомные байтовые смещения. Но жалуйтесь на любые скрытые состояния структур чтения потока, которые могут повлиять на производительность (что имеет значение для меня). – Crank

+0

Похоже, вы можете просто сериализовать 'streamoff', который является просто числом. Поскольку вы говорите, что не хотите сериализовать внутрисимвольные позиции, этого достаточно. Вы можете сохранить его в int64_t. –

ответ

0

Структура std::fpos<mbstate_t> не определена и может быть нетривиальное состояние в mbstate_t. Вы, конечно же, не можете переносить сериализацию этих объектов. Вы можете получить значение типа смещения (std::streamoff), которое является целым и его значение может быть сериализовано.

+0

Я реализовал это путем статического литья 'pos_type', возвращаемого' istream :: tellg() 'в' std :: streamoff'. Я предполагаю, что это законный способ, поскольку 'char_traits :: pos_type' определяется как' std :: fpos', который определил оператор преобразования в 'std :: streamoff', а также ctr в соответствии с' std :: fpos' [ссылка страница] (http://en.cppreference.com/w/cpp/io/fpos). Спасибо за ответ, Дитмар. – Crank

Смежные вопросы