Russian Qt Forum

Qt => Общие вопросы => Тема начата: vanessa от Января 28, 2010, 17:52



Название: Чтение данных из файла форматированного табуляторами
Отправлено: 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&)
.....
или я краями что-то не понимаю у него ведь есть соответствующая функция....
Вообщем я как-то зашел в тупик и прошу помощи.



Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: Amigo_sa от Января 28, 2010, 18:01
Можно воспользоваться функцией QByteArray QFile::readAll()

Чтобы получить список значений, разделеных табуляцией, есть функция QStringList QString::split(...


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 18:02
Почитай на тему QDataStream, только он читает/пишет бинарные данные в своем формата.
Проще читать с помощью одного из методов QIODevice::readLine.


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: lit-uriy от Января 28, 2010, 20:50
Цитировать
f.open()=" << f.open(QIODevice::ReadOnly);
А что это за запись такая?


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: niXman от Января 28, 2010, 20:57
Цитировать
А что это за запись такая?
ага, я тоже не въехал)

а вообще, дабы не городить велосипедов, могу порекомендовать boost.spirit


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 28, 2010, 22:06
Цитировать
f.open()=" << f.open(QIODevice::ReadOnly);
А что это за запись такая?
там потерялось  
Код:
qDebug() <<"
в начале строки.

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



Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 22:48
Amigo_sa уже написал выше... Для этого случая регулярные выражения избыточны, хватит и QString::split.


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 28, 2010, 22:51
Ок, спасибо, буду разбиратся.
А вот еще вопрос, у меня текст в файле в кодировке UTF-8, есть и кириллица, его как-то специально надо обрабатывать после readLine() ?


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

Конечно, для получения корректных строк, нужно воспользоваться QTextCodec или по простому QString::fromUtf8.
Использование QTextCodec более универсально, можно динамически настраивать кодеки для файлов в разной кодировке, второй жестко задает исходную кодировку.


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 28, 2010, 23:16
попробовал
QByteArray ba;


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

в результате кириллического текста не увидел или  так и должно быть ?


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 23:19
А в консоли у тебя Utf8?


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 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=


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 23:35
Строка в QString храниться в UNICODE, поэтому на Utf8 нормально не отображается.
Что бы увидеть ее на консоли с Utf8 можно сделать обратное преобразование:
qDebug() << s.toUtf8();


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

факир был пьян и фокус не удался. нет кириллицы


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 23:44
 ::)
А так?
Код
C++ (Qt)
       QString str = QString::fromUtf8( "Тестовая строка" );
       qDebug() << str;
       qDebug() << str.toUtf8();
 


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 28, 2010, 23:48
Код:
$./test
" "
" "
к сожалению вот так


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: BRE от Января 28, 2010, 23:55
Странно.
Вот тестовая программка. Посмотри в исходнике, строка читается? Попробуй запустить, что выведет.


Название: Re: Чтение данных из файла форматированного табуляторами
Отправлено: vanessa от Января 29, 2010, 00:07
ну я тоже сделал такую-же программку. текст не читается. Я попробовал вывести тест из своего файла на QLabel и увидел кириллицу, так что проблема видимо в qDebug()