2011-01-06 2 views
0

У меня есть класс Image, который имеет следующую реализациюC++ получить строку (сериализовать объект) от ostream

friend std::ostream& operator << (std::ostream &os,Image* &img); 

Так что я могу сериализовать его по телефону

ostm << img; // which will write an string into the ostream. 

Можно ли получить, что вывести строку из потока или сериализовать ее непосредственно в строковый объект?

Спасибо!

Решения работали как шарм. Спасибо огромное!

+1

Вы действительно имеете в виду 'Image * & img'? Для вывода «const Image &» будет более условным. –

+0

Да, это то, что говорит оригинальный код. –

+0

Пожалуйста, отправьте полный код; невозможно отладить ваш 'operator <<', не имея возможности увидеть его реализацию. –

ответ

1

Да, вы можете использовать std::ostringstream.

E.g.

#include <sstream> 
#include <string> 
#include <stdexcept> 

std::string Serialize(const Image& img) 
{ 
    std::ostringstream oss; 

    if (!(oss << img)) 
    { 
     throw std::runtime_error("Failed to serialize image"); 
    } 

    return oss.str(); 
} 
0

Предположительно ваш фактический объект является iostream или stringstream. Если iostream, вы можете сделать это:

std::iostream ss; 
ss << "Some text\nlol"; 
std::string all_of_it((std::istreambuf_iterator<char>(ss)), std::istreambuf_iterator<char>()); 
std::cout << all_of_it; // Outputs: "Some text", then "lol" on a new line; 

Вам нужен istreambuf_iterator, следовательно, требование для двунаправленного потока как iostream. Всякий раз, когда у вас есть извлечение, а также вставка, вы должны использовать это или stringstream (или fstream при работе с файлами).

Для stringstream просто используйте функцию-член .str(), чтобы получить его буфер как string.

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