IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Problème avec QTextStream


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut Problème avec QTextStream
    Bonjour voici un bout de code que j'ai simplifié au max pour isoler mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <QtCore/QCoreApplication>  
    #include <QFile>  
    #include <QTextStream>  
    int main(int argc, char *argv[])  
    {  
        if (argc > 1){  
            qint32 lineCounter = 0;  
            QFile myfile(argv[1]);  
            if(myfile.exists()){  
                if(myfile.open(QIODevice::ReadOnly)){  
                        QTextStream stream(&myfile);  
                        while(!stream.atEnd()){  
                            qint64 position = stream.pos();  
                            QString line = stream.readLine();  
                            lineCounter++;  
                        }  
                }  
            }  
             return lineCounter;  
        }  
        return -1;  
    }
    Le but est de parser un fichier texte ligne par ligne ( ici pour simplifier je me contente de les compter)
    Ca marche tant que le fichier que je passe en paramètre ne fait pas plus d'environ 16500 octets.
    Mais dés que le fichier est trop gros ça boucle sans fin ( stream.pos() renvoi -1, atEnd() ne renvoie jamais true, readLine() renvoi les lignes du debut du fichier).

    Configuration : QT4.6.4 opensource-vs2008 ( dll en release ), windows XP, env: Qt creator ou visual studio

    En utilisant directement le QFile ça à l'air de marcher, mais j'aimerais savoir pourquoi le QTextStream ne fonctionne pas, ou si c'est mon cerveau.
    Merci
    JB

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonsoir,

    C'est peut-être sans lien, mais ajouter QIODevice::Text pourrait être intéressant dans le open vu qu'il s'agit d'une lecture ligne par ligne d'un fichier texte.

    Pour le problème lui-même, il faudrait voir avec le point précédent ainsi que ce que retourne à chaque fois readLine() lorsque pos() retourne -1. Est-ce que cela continue à read le fichier ou bien cela boucle sur la même chose/rien ?

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Ça a pas l'air de marcher mieux avec le QIODevice::Text.
    Par contre ça a l'aire de marcher avec une QT4.2.3_vs2005 que j'avais avant, mais aussi avec une 4.8.0_mingw. ( j'ai pas essayé 4.8.0_vs2005)

    Sinon dans les sources de QTextSream on trouve
    static const int QTEXTSTREAM_BUFFERSIZE = 16384;
    qui correspond étrangement à la taille à partir de laquelle ça débloque.
    En fait quand pos() retourne -1 ça repart du début du fichier, on boucle indéfiniment sur les 16384 1ers octets...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    En cherchant dans le code des examples j'ai trouvé :
    dialog/findfiles/windows.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (file.open(QIODevice::ReadOnly)) {
                QString line;
                QTextStream in(&file);
                while (!in.atEnd()) {
                    if (progressDialog.wasCanceled())
                        break;
                    line = in.readLine();
                    if (line.contains(text)) {
                        foundFiles << files[i];
                        break;
                    }
                }
            }
    qui fait a peu près la même chose que moi.
    Seule difference y a pas d'appel à pos()
    du coup j'ai viré cet appel et mon code marche nickel.

    Moralité:
    • c'est pos() qui fout la grouille
    • ca marchait en 4.2.3
    • on a bien un regression de Qt


    dans l'aide il est ecrit:
    qint64 QTextStream::pos () const
    Returns the device position corresponding to the current position of the stream, or -1 if an error occurs (e.g., if there is no device or string, or if there's a device error).

    Because QTextStream is buffered, this function may have to seek the device to reconstruct a valid device position. This operation can be expensive, so you may want to avoid calling this function in a tight loop.

    This function was introduced in Qt 4.2.

    See also seek().
    Donc c'est déconseillé de l'utiliser, par contre c'est pas seulement coûteux mais buggé.
    Par contre pour mon cas je vais devoir faire autrement car je me servais de pos()...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Maintenant que sais d'ou viens le problème j'ai facilement trouvé:
    https://bugreports.qt-project.org/browse/QTBUG-9989

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Effectivement, il semblerait que cette variable ait une certaine influence. Sauf qu'il semblerait que le bug ait été résolu pour la version 4.8 de Qt : https://bugreports.qt-project.org/browse/QTBUG-9814

    Sans doute à tester ?

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo