Re[2]: Как перевести структуру в строковый буфер
От: Вов и К  
Дата: 19.04.05 11:18
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Вов и К, Вы писали:


ВИК>>У меня имелось несколько int и float переменных, которые я записывал в символьный массив примерно так:

ВИК>> char Msg[256];
ВИК>> sprintf(Msg, "%d %d %f %f",
ВИК>> m_nTemp1, m_nTemp2, m_fTemp3, m_fTemp4);
ВИК>>Теперь мне надо эти и еще несколько переменных и массивов запихнуть в структуру.
ВИК>>ВОПРОС: как полученную структуру перевести в символьный массив char Msg[256]?

К>В С++ для этих целей пользуются


К>(1) перегрузкой функций...


К>Например, для вывода в любой текстовый поток общепринято завести семейство операторов <<

К>
К>std::ostream& operator<< (std::ostream& ostr, const YourType& t);
К>

К>тогда вывод структуры можно рекурсивно определить через вывод её полей
К>
К>struct Foo
К>{
К>  int x;
К>  double y;
К>  Bar z; // ещё какая-то структура
К>  Buz t[10]; // и даже массив
К>};

К>inline std::ostream& operator<< (std::ostream& ostr, const Foo& foo)
К>{
К>  ostr << "{ ";
К>  ostr << x << " " << y << " " << z << " "; // предполагаем, что такой оператор есть и для Bar
К>  std::copy(t,t+10, std::ostream_iterator<Buz>(ostr, " ")); // маленькая хитрость - копирование массива в поток
К>    // превращается внутри в ostr << t[0] << " " << t[1] << " " ...
К>  ostr << "}";
К>  return ostr;
К>}
К>


К>(2) и полиморфными объектами

К>Если ты решился делать всё через потоки (благо, для них уже много чего имеется в STL), обрати внимание: всё семейство operator<< принимает слева ostream. Это базовый класс, наследники которого — файловые и консольные потоки, но не только. Один из них — ostringstream — всё выводимое коллекционирует в строку.
К>
К>Foo foo;
К>std::ostringstream oss;
К>oss << foo;
К>std::string s = oss.str();
К>


прошу прощения за навязчивость. С вышеизложенным я разобрался. А как сделать обратную операцию из строкового потока в структуру. Куда считывать пробелв между элементами?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.