Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Ноябрь 25, 2016, 15:18



Название: Чтение с файла
Отправлено: demaker от Ноябрь 25, 2016, 15:18
Не могу считать с файла  ???
Не понимаю в чем может быть причина, файл находит и открывает, но в консоль не выводит данные,
хотя в файле все есть.
Код
C++ (Qt)
bool MainWindow::parserFile(QString path)
{
   qDebug()<<"path = "<<path;
   QFile pFile(path);
   QString line;
   buffer = new QStringList;
   buffer->clear();
   if(pFile.exists()){
       if(!pFile.open(QIODevice::ReadWrite)){
           qCritical()<<"file not open";
           delete buffer;
           return false;
       }
       QByteArray ba = pFile.readAll();
       qDebug()<<"ba = "<<ba;
       QString str;
       str.append(ba);
       qDebug()<<str;
       QStringList strList= str.split("\n");
       qDebug()<<"strList = "<<strList.count();
       for(int i = 0; i < strList.count(); i++){
           QString s = strList.at(i);
           qDebug()<<"s = "<<s;
       }
       pFile.close();
       return true;
   }
   qCritical()<<"file not exists load file";
   delete buffer;
   return false;
}
 

Такое впечатление, что
Код:
 QByteArray ba = pFile.readAll();
не работает. Не понимаю ???


Название: Re: Чтение с файла
Отправлено: __Heaven__ от Ноябрь 25, 2016, 16:12
Такое впечатление, что
Код:
 QByteArray ba = pFile.readAll();

Цитировать
This function has no way of reporting errors; returning an empty QByteArray can mean either that no data was currently available for reading, or that an error occurred.


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 25, 2016, 16:56
Такое впечатление, что
Код:
 QByteArray ba = pFile.readAll();

Цитировать
This function has no way of reporting errors; returning an empty QByteArray can mean either that no data was currently available for reading, or that an error occurred.


Но в файле есть данные.
Или я Вас не правильно понял?


Название: Re: Чтение с файла
Отправлено: Авварон от Ноябрь 25, 2016, 17:24
Попробуйте ReadOnly. WriteOnly делает Truncate файлу.


Название: Re: Чтение с файла
Отправлено: Alex Custov от Ноябрь 25, 2016, 18:11
А что показывает такой код

Код:
qDebug()<<"ba.size() = "<<ba.size();


Название: Re: Чтение с файла
Отправлено: __Heaven__ от Ноябрь 25, 2016, 19:14
У меня readAll когда-то давно плохо работал при считывании больших файлов.


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 26, 2016, 10:21
Спасибо,  за советы. В понедельник отпишусь о результатах.


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 14:49
А что показывает такой код
Код:
qDebug()<<"ba.size() = "<<ba.size();

Код:
ba.size = 29114


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 14:50
Попробуйте ReadOnly. WriteOnly делает Truncate файлу.
Не помогло
Что делать??? ??? ??? ???


Название: Re: Чтение с файла
Отправлено: Old от Ноябрь 28, 2016, 14:55
Не помогло
Что делать??? ??? ??? ???
Так а qDebug()<<str  вашем коде что показывает?


Название: Re: Чтение с файла
Отправлено: Alex Custov от Ноябрь 28, 2016, 14:57
А что показывает такой код
Код:
qDebug()<<"ba.size() = "<<ba.size();

Код:
ba.size = 29114

Так там наверняка какая-нибудь бинарщина, вывод которой на консоль останавливается после первого же нуля.


Название: Re: Чтение с файла
Отправлено: Old от Ноябрь 28, 2016, 15:02
Так там наверняка какая-нибудь бинарщина, вывод которой на консоль останавливается после первого же нуля.
Т.е. вы бинарные данные присвоили строке и пытаетесь их сплитом разделить?  ::)


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 15:08
Так там наверняка какая-нибудь бинарщина, вывод которой на консоль останавливается после первого же нуля.
Т.е. вы бинарные данные присвоили строке и пытаетесь их сплитом разделить?  ::)

А как же мне сделать тогда правильно.
Подскажите пожалуйста ::)


Название: Re: Чтение с файла
Отправлено: Old от Ноябрь 28, 2016, 15:18
А как же мне сделать тогда правильно.
Подскажите пожалуйста ::)
Делить на строки имеет смысл только текстовые данные, поэтому файл желательно иметь текстовый. :)

После прочтения данных в QByteArray их нужно правильно сконвертировать в QString в зависимости от кодировки исходного файла:
Код
C++ (Qt)
// Если текстовый файл в UTF-8
QTextCodec *codec = QTextCodec::codecForName( "UTF-8" );
QString str = codec->toUnicode( ba );
 
QStringList strList= str.split("\n");
qDebug()<<"strList = "<<strList.size();
 


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 15:31
А как же мне сделать тогда правильно.
Подскажите пожалуйста ::)
Делить на строки имеет смысл только текстовые данные, поэтому файл желательно иметь текстовый. :)

После прочтения данных в QByteArray их нужно правильно сконвертировать в QString в зависимости от кодировки исходного файла:
Код
C++ (Qt)
// Если текстовый файл в UTF-8
QTextCodec *codec = QTextCodec::codecForName( "UTF-8" );
QString str = codec->toUnicode( ba );
 
QStringList strList= str.split("\n");
qDebug()<<"strList = "<<strList.size();
 
Сделал как Вы сказали
Код
C++ (Qt)
bool MainWindow::parserFile(QString path)
{
   qDebug()<<"path = "<<path;
   QFile pFile(path);
   QString line;
   buffer = new QStringList;
   buffer->clear();
   if(pFile.exists()){
       if(!pFile.open(QIODevice::ReadOnly)){
           qCritical()<<"file not open";
           delete buffer;
           return false;
       }
       QByteArray ba = pFile.readAll();
       qDebug()<<"ba.size() = "<<ba.size();
       QTextCodec *codec = QTextCodec::codecForName("UTF-8");
       QString str = codec->toUnicode(ba);
       //str.append(ba);
       qDebug()<<str;
       QStringList strList= str.split("\n");
       qDebug()<<"strList = "<<strList.count();
       for(int i = 0; i < strList.count(); i++){
           QString s = strList.at(i);
           qDebug()<<"s = "<<s;
       }
       pFile.close();
       return true;
   }
   qCritical()<<"file not exists load file";
   delete buffer;
   return false;
}
 

Только в консоль выводит кучу строк
Код:
s = "
это нормально ???
Я думал хоть строки увижу. А файл сам текстовый.


Название: Re: Чтение с файла
Отправлено: Alex Custov от Ноябрь 28, 2016, 15:38
текстовый в какой кодировке? Ты можешь этот файл приложить?


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 16:06
текстовый в какой кодировке? Ты можешь этот файл приложить?
Да, конечно


Название: Re: Чтение с файла
Отправлено: Авварон от Ноябрь 28, 2016, 16:11
Это 16й UTF, там половина байт нули.


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 16:52
Это 16й UTF, там половина байт нули.

Спасибо :)


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 17:30
Только я вот сделал так и опять не пашет :-\
Код
C++ (Qt)
bool MainWindow::parserFile(QString path)
{
   qDebug()<<"path = "<<path;
   QFile pFile(path);
   QByteArray baLine;
   if(pFile.exists()){
       if(!pFile.open(QIODevice::ReadOnly)){
           qCritical()<<"file not open";
           return false;
       }
       else{
           while(!pFile.atEnd()){
               baLine = pFile.readLine();
               qDebug()<<"line size = "<<baLine.size();
               QTextCodec *codec = QTextCodec::codecForName("UTF-16");
               QString str = codec->toUnicode(baLine.data());
               str.append(baLine);
               qDebug()<<"str = "<<str;
               str.clear();
               baLine.clear();
           }
           pFile.close();
           return true;
       }
   qCritical()<<"file not exists load file";    
   return false;
}
 
Строки в консоле пустые


Название: Re: Чтение с файла
Отправлено: Авварон от Ноябрь 28, 2016, 18:20
Код:
-                QString str = codec->toUnicode(baLine.data());
+                QString str = codec->toUnicode(baLine);

Угадайте почему.
Upd:
Код:
-    if(!pFile.open(QIODevice::ReadOnly)){
+    if(!pFile.open(QIODevice::ReadOnly | QIODevice::Text)){
(это выкосит \r)

И это ещё не всё


Название: Re: Чтение с файла
Отправлено: demaker от Ноябрь 28, 2016, 18:35
Код:
-                QString str = codec->toUnicode(baLine.data());
+                QString str = codec->toUnicode(baLine);

Угадайте почему.
Upd:
Код:
-    if(!pFile.open(QIODevice::ReadOnly)){
+    if(!pFile.open(QIODevice::ReadOnly | QIODevice::Text)){
(это выкосит \r)

И это ещё не всё


 :o и что же еще


Название: Re: Чтение с файла
Отправлено: Авварон от Ноябрь 28, 2016, 18:45
Код:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString path = "/home/abbapoh/Загрузки/Base_triton.txt";

    qDebug()<<"path = "<<path;
    QFile pFile(path);
    if(pFile.exists()){
        if(!pFile.open(QIODevice::ReadOnly | QIODevice::Text)){
//        if(!pFile.open(QIODevice::ReadOnly)){
            qCritical()<<"file not open";
            return false;
        }
        else{
            QByteArray baLine = pFile.readAll();
            // если не хочется юзать кодек
            //                QString str((QChar*)baLine.data(), baLine.size() / 2);
            QTextCodec *codec = QTextCodec::codecForName("UTF-16");
            QString str = codec->toUnicode(baLine);
            qDebug() << str;
            pFile.close();
            return true;
        }
    qCritical()<<"file not exists load file";
    return false;
    }

    return a.exec();
}

Почему глючит readLine я понять не смог.
Была попытка читать блоками по 256 байт, но текст содержит китайщину, а значит там есть суррогатные пары, которые интерпретируются неверно, если конец блока попадает в середину пары.


Название: Re: Чтение с файла
Отправлено: __Heaven__ от Декабрь 08, 2016, 12:11
Предполагаю, что вы пытаетесь декодировать 1 байт из utf-16 в utf-8, но utf-16 должен содержать 2 байта на символ.