2016-12-15 16 views
1

Я хочу написать кучу данных объекту ostream и вернуть количество записанных байтов. Например:Как я могу отслеживать количество байтов, записанных в объект std :: ostream?

using namespace std; 
size_t writeStuffToStream(ostream &stream) 
{ 
    stream << some_string << some_integer << some_other_arbitrary_object << endl; 
    return number_of_bytes_written; 
} 

Существует очевидный обходной путь писать все на stringstream и получить количество байт из этого, а затем писать stringstream в поток, но это требует дополнительного времени и памяти.

Я также понимаю, что если бы все данные, которые я хотел написать, были существующими строками, тогда проблем не было бы. Это проблемы some_integer и some_other_arbitrary_object.

+1

вы можете связать объекты streambuf, чтобы вы могли вывести счетчик streambuf из std :: streambuf. в нем делегировать операции с исходным streambuf после записи информации о счетчике. Здесь есть хороший учебник: http://www.mr-edd.co.uk/blog/beginners_guide_streambuf –

ответ

0

Используйте метод ostreamtellp().

Обратите внимание, что это может случиться, если предоставленный ostream не поддерживает позиции. В этом случае вы можете создать временный ostringstream для форматирования ваших данных, затем извлечь string, получить его длину и отправить его на вход ostream.

Возможно, вы также можете написать пользовательский номер ostream, который отправит другому ostream и посчитает испущенные символы. Я ожидал найти виртуальный метод для переопределения в ostream для записи только символов, но я не нашел его :(Вы можете повторно использовать код строкового потока и заменить запись буфера на записи в другой поток. string-stream.cc составляет около 500 строк , так что это не так уж плохо.

+0

Да, меня немного отвлекает тот факт, что 'tellp()' не гарантированно работает для всех объектов. И я уже упоминал, что Я не хочу создавать промежуточный 'stringstream'. Как создать пользовательский' ostream', который может считать записанные байты, если я не могу считать байты, написанные в первую очередь? – Matt

+0

Я посмотрю на него и обновлю свой комментарий;) –