Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение данных из файла 
V
    Опции темы
gordmiand
Дата 15.10.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



есть текстовый файл с содержанием типа:

//переменное число строк комментариев
число = строка без кавычек (то есть: число пробел = пробел строка(возможно с пробелами))
число = строка без кавычек
число = строка без кавычек
число = строка без кавычек
число = строка без кавычек
....  


подскажите пож-та как мне наиболее простым/оптимальным способом (с помощью регулярного выражения?) сосчитать все числа в один массив, а строки - в другой (или все в один массив, но в разные его элементы)...
я начал так:
Код

 QFile file("./papka1/file1.txt");
   if (file.exists())
{
 file.open(QIODevice::ReadWrite | QIODevice::Text);
   QTextStream buf(&file);
   QString line = buf.readLine();
        while (!line.isNull())
        {
            ???
          line = buf.readLine();
        }
file.close();
}
 
PM MAIL   Вверх
newbee
Дата 16.10.2011, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



Находишь первую комбинацию " = " в строке (indexOf) и берешь от нее левую часть (left) и правую (right). Левую часть преобразуешь в число (toInt).


--------------------
You're face to face
With man who sold the world
PM   Вверх
RazrFalcon
Дата 16.10.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.7.2009

Репутация: 1
Всего: 1



Код

QList<int> nums;
QStringList strings;
while (!line.isNull())
{
QStringList tempList= line.split(" = ");
nums.append(tempList.first().toInt());
strings.append(tempList.last());
line = buf.readLine();
}

PM MAIL   Вверх
newbee
Дата 16.10.2011, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



RazrFalcon, теперь попробуй разобрать своей программой такое:
Цитата
42 = sexy kittens = free love
Под условие она попадает.

Добавлено через 24 секунды
Спокойной ночи и удачной отладки smile


--------------------
You're face to face
With man who sold the world
PM   Вверх
RazrFalcon
Дата 16.10.2011, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.7.2009

Репутация: 1
Всего: 1



Да, не выйдет.

Добавлено через 12 минут и 47 секунд
Можно и по другому:
Код

QString str = "42 = sexy kittens = free love";

QString tmpStr = QString(str).remove(QRegExp(" = .*"));
qDebug()<<tmpStr;
qDebug()<<QString(str).remove(tmpStr+" = ");


Код

"42" 
"sexy kittens = free love" 


Это сообщение отредактировал(а) RazrFalcon - 16.10.2011, 01:24
PM MAIL   Вверх
newbee
Дата 16.10.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



RazrFalcon, ну вот мы и пришли к моему варианту, только с большими накладными расходами smile


--------------------
You're face to face
With man who sold the world
PM   Вверх
gordmiand
Дата 16.10.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



newbee: такого варианта, как "42 = sexy kittens = free love" быть не может, но на всякий случай лучше конечно перестраховаться - подскажите пож-та программную реализацию Вашего способа решения "Находишь первую комбинацию " = " в строке (indexOf) и берешь от нее левую часть (left) и правую (right). Левую часть преобразуешь в число (toInt)."
PM MAIL   Вверх
newbee
Дата 16.10.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



gordmiand, я уже подсказала, в скобках перечислила все функции QString, которые понадобятся.


--------------------
You're face to face
With man who sold the world
PM   Вверх
gordmiand
Дата 16.10.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



да я пробовал - что-то никак не выходит...ну если Вам сложно привести пример кода - буду дальше думать...
PM MAIL   Вверх
gordmiand
Дата 16.10.2011, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



RazrFalcon: в Вашем самом первом ответе-примере не учтено возможное наличие в начале файла переменного числа "ненужных строк" - комментариев и т.п.
например: 

// коммент
**разный текст 
бла-бла-бла

01 = строка1
15 = строка 2
...

тогда ответы в Вашем примере будут:
0 "// коммент" 
0 "**разный текст"
и так далее

можно конечно поставить дополнительное условие:
Код

 while (!line.isNull())
        {
            QStringList tempList = line.split(" = ");
            if (tempList.first().toInt()>0)
            {
             nums.append(tempList.first().toInt());
             strings.append(tempList.last());
            }
            line = buf.readLine();
        }

но хотелось бы сделать более оптимальным условие нахождения в файле значимых строк (число = строка)...подскажите пож-та модернизацию данного примера...
PM MAIL   Вверх
RazrFalcon
Дата 17.10.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.7.2009

Репутация: 1
Всего: 1



Можно и так сделать:
Код

QStringList tempList = line.split("\n"); // бьем на строки
tempList = tempList.filter(" = "); // оставляем только с " = "

Это убьет строки не нужные.

Пример бы полный, исходно файла. Я же писал только под то, что в шапке.
PM MAIL   Вверх
gordmiand
Дата 6.9.2012, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



содержимое файла:
Код

//comment1
//comment2

01 = p756rivet
02 = vsem
03 = ot
04 = menya


код
Код

 QFile file("./file.cfg");
 QStringList strings;

if (file.exists())
{
file.open(QIODevice::ReadWrite | QIODevice::Text);

  QTextStream buf(&file);
  QString line = buf.readLine();

 while (!line.isNull())
 {
   QStringList tempList = line.split(" = ");

   if (tempList.first().toInt()>0)
   {
    strings.append(tempList.first());
    strings.append(tempList.last());
    ScenariosCount++;
   }
  line = buf.readLine();
 }
file.close();
} // if


первую строку такой код разберет как 01 и 756, а надо, чтобы элементами листа strings были 01 и p756rivet (то есть все, что после пробела после "=")... подскажите как мне этот код изменить надо!!!


PM MAIL   Вверх
math64
Дата 7.9.2012, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(gordmiand @  6.9.2012,  21:49 Найти цитируемый пост)
первую строку такой код разберет как 01 и 756

С чего ты взял? Для второго элемента списка toInt() не вызывается - всё будет как надо.
Но если слева будет не число - toInt() вернёт лажу. Нужно
Код

bool ok;
int n = tempList.first().toInt(&ok);
if (ok && n > 0) ...

PM   Вверх
gordmiand
Дата 7.9.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



math64: все верно - просто изначально строки из файла считывались с игнорированием русских букв - добавил setCodec для buf и все стало нормально...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.