Russian Qt Forum
Ноябрь 26, 2024, 22:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Чтение данных из файла форматированного табуляторами  (Прочитано 10064 раз)
vanessa
Гость
« : Январь 28, 2010, 17:52 »

Я что-то зашел в тупик и не могу понять в чем проблема. Нужно прочитать данные из файла.
Пример данных
Код:
'Мама'<tab>12
'Папа'<tab>56

в результате хочу получить из этого файла в цикле строчку (текст, что в кавычках так как в реальных данных могут быть пробелы) и число.
но паралельно напорлся еще на одну проблему, код
Код:
QFile f("reg.txt");
QString s;

f.open()=" << f.open(QIODevice::ReadOnly);

f >> s;

при компиляции выдает ошибки
Код:
regtest.cpp: In function ‘int main(int, char**)’:
regtest.cpp:25: error: no match for ‘operator>>’ in ‘f >> s’
/usr/include/qt4/QtCore/qchar.h:386: note: candidates are: QDataStream& operator>>(QDataStream&, QChar&)
/usr/include/qt4/QtCore/qbytearray.h:565: note:                 QDataStream& operator>>(QDataStream&, QByteArray&)
/usr/include/qt4/QtCore/qstring.h:1022: note:                 QDataStream& operator>>(QDataStream&, QString&)
.....
или я краями что-то не понимаю у него ведь есть соответствующая функция....
Вообщем я как-то зашел в тупик и прошу помощи.

Записан
Amigo_sa
Гость
« Ответ #1 : Январь 28, 2010, 18:01 »

Можно воспользоваться функцией QByteArray QFile::readAll()

Чтобы получить список значений, разделеных табуляцией, есть функция QStringList QString::split(...
« Последнее редактирование: Январь 28, 2010, 18:02 от Amigo_sa » Записан
BRE
Гость
« Ответ #2 : Январь 28, 2010, 18:02 »

Почитай на тему QDataStream, только он читает/пишет бинарные данные в своем формата.
Проще читать с помощью одного из методов QIODevice::readLine.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 28, 2010, 20:50 »

Цитировать
f.open()=" << f.open(QIODevice::ReadOnly);
А что это за запись такая?
Записан

Юра.
niXman
Гость
« Ответ #4 : Январь 28, 2010, 20:57 »

Цитировать
А что это за запись такая?
ага, я тоже не въехал)

а вообще, дабы не городить велосипедов, могу порекомендовать boost.spirit
Записан
vanessa
Гость
« Ответ #5 : Январь 28, 2010, 22:06 »

Цитировать
f.open()=" << f.open(QIODevice::ReadOnly);
А что это за запись такая?
там потерялось  
Код:
qDebug() <<"
в начале строки.

А как-то QRegExp запрячь для этой работы можно? ведь с помощью регулярного выражения '([^'])'+(\d+) легко можно разобрать подобное на части. для скобок () написано что ищет и сохраняет в памяти группу символов, как потом к этой группе добраться ?
в perl такой фокус легко получается.

« Последнее редактирование: Январь 28, 2010, 22:38 от vanessa » Записан
BRE
Гость
« Ответ #6 : Январь 28, 2010, 22:48 »

Amigo_sa уже написал выше... Для этого случая регулярные выражения избыточны, хватит и QString::split.
Записан
vanessa
Гость
« Ответ #7 : Январь 28, 2010, 22:51 »

Ок, спасибо, буду разбиратся.
А вот еще вопрос, у меня текст в файле в кодировке UTF-8, есть и кириллица, его как-то специально надо обрабатывать после readLine() ?
Записан
BRE
Гость
« Ответ #8 : Январь 28, 2010, 22:54 »

Ок, спасибо, буду разбиратся.
А вот еще вопрос, у меня текст в файле в кодировке UTF-8, есть и кириллица, его как-то специально надо обрабатывать после readLine() ?

Конечно, для получения корректных строк, нужно воспользоваться QTextCodec или по простому QString::fromUtf8.
Использование QTextCodec более универсально, можно динамически настраивать кодеки для файлов в разной кодировке, второй жестко задает исходную кодировку.
« Последнее редактирование: Январь 28, 2010, 22:58 от BRE » Записан
vanessa
Гость
« Ответ #9 : Январь 28, 2010, 23:16 »

попробовал
QByteArray ba;


s=QString::fromUtf8(f.realLine())
qDebug() << s;

в результате кириллического текста не увидел или  так и должно быть ?
Записан
BRE
Гость
« Ответ #10 : Январь 28, 2010, 23:19 »

А в консоли у тебя Utf8?
Записан
vanessa
Гость
« Ответ #11 : Январь 28, 2010, 23:30 »

ага, когда делаю
% cat reg.txt
то текст вижу правильно. и еще у меня точно UTF-8
Код:
% locale                                                                                                                        ~
LANG=uk_UA.UTF-8
LC_CTYPE="uk_UA.UTF-8"
LC_NUMERIC="uk_UA.UTF-8"
LC_TIME="uk_UA.UTF-8"
LC_COLLATE="uk_UA.UTF-8"
LC_MONETARY="uk_UA.UTF-8"
LC_MESSAGES="uk_UA.UTF-8"
LC_PAPER="uk_UA.UTF-8"
LC_NAME="uk_UA.UTF-8"
LC_ADDRESS="uk_UA.UTF-8"
LC_TELEPHONE="uk_UA.UTF-8"
LC_MEASUREMENT="uk_UA.UTF-8"
LC_IDENTIFICATION="uk_UA.UTF-8"
LC_ALL=
Записан
BRE
Гость
« Ответ #12 : Январь 28, 2010, 23:35 »

Строка в QString храниться в UNICODE, поэтому на Utf8 нормально не отображается.
Что бы увидеть ее на консоли с Utf8 можно сделать обратное преобразование:
qDebug() << s.toUtf8();
Записан
vanessa
Гость
« Ответ #13 : Январь 28, 2010, 23:41 »

Строка в QString храниться в UNICODE, поэтому на Utf8 нормально не отображается.
Что бы увидеть ее на консоли с Utf8 можно сделать обратное преобразование:
qDebug() << s.toUtf8();

факир был пьян и фокус не удался. нет кириллицы
Записан
BRE
Гость
« Ответ #14 : Январь 28, 2010, 23:44 »

 Строит глазки
А так?
Код
C++ (Qt)
       QString str = QString::fromUtf8( "Тестовая строка" );
       qDebug() << str;
       qDebug() << str.toUtf8();
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.353 секунд. Запросов: 23.