Длина повышения :: iostream :: basic_array_sink / source - PullRequest
2 голосов
/ 07 июля 2010

Я использую для сериализации "как это можно увидеть здесь" .Это работало нормально, но я не мог понять, как получить размер записанного буфера. Я искал документацию по Boost и, по-видимому, нет способа сделать это, кроме как создать мойку / источник самостоятельно?

Спасибо

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Интересно, что я просто попробовал решение, предложенное hkaiser, и вместо того, чтобы получить количество записанных байтов, я получил число байтов в исходном массиве (т.е. поиск до конца прошел ВСЕ до конца буфера).

Мне пришлось немного подправить этот призыв:

(int)boost::iostreams::seek( s, 0, std::ios_base::cur )

Может быть, они что-то изменили в библиотеке буста, что заставило его вести себя по-другому. Я думаю, что мы используем последние и самые лучшие на 20 января 2011 года.

4 голосов
/ 08 июля 2010

boost::iostreams::basic_array_sink моделирует только SinkDevice, что дает вам семантику только для записи и не позволяет определить количество записанных байтов.

OTOH, его брат boost::iostreams::basic_array моделирует SeekableDevice, позволяющий использовать функцию-член seek () вашего потока:

namespace io = boost::iostreams;

char buffer[4096]; 
io::stream<io::basic_array<char> > source(buffer, buffer_size); 

boost::archive::binary_oarchive oa(source); 
oa << serializable_object;  

// move current stream position to the end, io::seek() returns new position 
std::cout << "Bytes written: " 
          << io::seek(source, 0, std::ios_base::end) 
          << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...