Russian Qt Forum

Qt => Общие вопросы => Тема начата: tumanovalex от Июль 31, 2010, 10:46



Название: Разбор строки с цифрами средствами QT
Отправлено: tumanovalex от Июль 31, 2010, 10:46
Есть файл с 3 колонками из цифр. Колонки могут отделяться друг от друга пробелами и табуляциями, количество которых неизвестно (пользователи вводят данные по разному). Я хотел бы выделить из каждой строки по 3 числа. Не нашел функции QT для решения этой задачи, пришлось сделать как обычно в С (на примере строки):
Код:
QString sBuf = " \t 1.03   \t   123.06  \t\t     \t 15.6  \t";
  float rBufItem[3];
  sscanf(sBuf.toAscii(), "%f%f%f", &rBufItem[0], &rBufItem[1], &rBufItem[2]);
  for(i=0; i < 3; i++) {
    printf("%f\t", rBufItem[i]);
  }
Мне предложили использовать split в стринглист, появились нулевые элементы, которые нужно удалять. Предложили и другое решение:
Код:
QString string = " \t 1.03   \t   123.06  \t\t     \t 15.6  \t";
QTextStream stream ( &string );
for ( std::size_t i = 0; i < amountItems; ++i ) {
    stream >> items[ i ];
}
Однако это решение тоже не помогло при изменении строки
Код:
QString string = " \t 1.03    \tttt \t   123.06    \t\t \t    \t 15.6  \t";
  QTextStream stream ( &string );
  for (i = 0; i < 3; ++i ) {
      stream >> rBufItem[ i ];
  }
  for(i = 0; i < 3; i++) {
    printf("%f\t", rBufItem[i]);
  }
Числа стали считываться неправильно (как и при использовании sscanf даже при строке char). Подскажите, пожалуйста, как решить мою задачу средствам QT и почему приведенные выше решения не дают правильных результатов.


Название: Re: Разбор строки с цифрами средствами QT
Отправлено: Sancho_s_rancho от Июль 31, 2010, 11:38
Вам правильно предложили использовать QString::split().  Если уж с помощью регулярных выражений это разбиение невозможно формализовать (в чем я ооооооооооооочень сильно сомневаюсь), то это вообще невозможно формализовать. У вас есть QRegExp. Изучите документацию и напишите правило. За вас это делать никто не будет.
Пи.Си. По поводу нулевых элементов:
Код:
QStringList QString::split ( const QRegExp & rx, SplitBehavior behavior = KeepEmptyParts ) const
. Как вы думаете, что значит SplitBehavior behavior = KeepEmptyParts?