Здравствуйте, Вов и К, Вы писали:
(оверквотинг покусан)
ВИК>прошу прощения за навязчивость. С вышеизложенным я разобрался. А как сделать обратную операцию из строкового потока в структуру. Куда считывать пробелв между элементами?
А никуда. Определяешь istream& operator>>(istream& ist, YourType& var)
и все числа будут считаны через пробелы, а вот со строками уже сложности.
Дело в том, что ost<<str пишет строку str как есть, а ist>>str читает до разделителя (пробела или перевода каретки).
Если str содержала разделители, получаем неприятность.
Чтобы избежать этого, можно, например, закодировать строку. Примерно так:
string percent_encode(string s)
{
// заменить все спецсимволы (0x01-0x20) на читаемые последовательности
string dst;
for(int i=0; i<s.size(); ++i)
{
char c = s[i];
char buf[4];
if(c=='%' || isspace(c) || iscntrl(c)) { sprintf(buf, "%%%02X", (unsigned char)c); dst += buf; }
else { dst += c; }
}
return dst;
}
string percent_decode(string s)
{
// восстановить спецсимволы из %XX
string dst;
for(int i=0; i<s.size(); )
{
char c = s[i];
if(isspace(c) || iscntrl(c)) { ++i; } // игнорируем пробельные символы, их просто не должно быть
else if(c != '%') { dst += c; ++i; }
else { char buf[] = { '0', 'x', s[i+1], s[i+2], 0 }; c = atoi(buf); dst += c; i += 3; }
}
return dst;
}
(конечно, алгоритм неоптимальный. перепиши его на свой вкус).
Теперь осталось переписать сериализацию:
ostream& operator << (ostream& ost, YourType const& data)
{
ost << percent_encode(data.s1) << ' ' << percent_encode(data.s2) << data.n3;
return ost;
}
istream& operator >> (istream& ist, YourType& data)
{
string tmp;
ist >> tmp; data.s1 = percent_decode(tmp);
ist >> tmp; data.s2 = percent_decode(tmp);
ist >> data.n3;
return ist;
}