Re[3]: Как перевести структуру в строковый буфер
От: Кодт Россия  
Дата: 19.04.05 12:00
Оценка:
Здравствуйте, Вов и К, Вы писали:

(оверквотинг покусан)

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


А никуда. Определяешь 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;
}
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.