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 :

QTextStream ne lit pas le fichier


Sujet :

Qt

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut QTextStream ne lit pas le fichier
    Salut,
    Au debut pardon de mon mauvais francais.
    J'essaie de lire un fichier de texte avec
    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
     
    #include <QtGui>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	QCoreApplication app(argc, argv);
    	QFile file("version.txt");
    	if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    	{
    		cout << "Can't open file!" << endl;
    		return 0;
    	}
    	QTextStream fs(&file);
    	while (!fs.atEnd())
    		cout << fs.readLine().toLatin1().data();
    	return app.exec();
    }
    Ca ne marche pas parce que il semble que on est toujours a la fin de fichier. Mais, si au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return app.exec();
    je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	app.quit();
    	return 1;
    donc on a maintenant le code
    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
     
     
    #include <QtGui>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	QCoreApplication app(argc, argv);
    	QFile file("version.txt");
    	if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    	{
    		cout << "Can't open file!" << endl;
    		return 0;
    	}
    	QTextStream fs(&file);
    	while (!fs.atEnd())
    		cout << fs.readLine().toLatin1().data();
    	app.quit();
    	return 1;
    }
    application lit tous les lignes de fichier. Pourquoi QCoreApplication::exec() ne permet pas de lire le fichier? Meme situation est avec QApplication.

  2. #2
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    Voici un code fonctionnel qui prend en argument le fichier à analyser.

    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
    24
    25
    26
    27
    28
    #include <QtCore>
     
    int main(int argc, char *argv[]) {
        enum ExitCode
        {
            Success,
            Failure
        };
     
        QTextStream errorStream(stderr);
        QTextStream standardStream(stdout);
     
        QCoreApplication app(argc, argv);
     
        QFile file(argv[1]);
     
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            errorStream << "Can't open file " << argv[1] << endl;
            return Failure;
        }
     
        QTextStream fs(&file);
     
        while(!fs.atEnd())
            standardStream << fs.readLine() << endl;
     
        return Success;
    }

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut et bienvenue,
    A mon avis :

    les deux versions on lu le fichier. La différence est ce qui se passe au niveau du cout.
    cout bufferise les donnés avant de les afficher =>
    * avec exec() : tu lance l'eventloop. Cout à bufferiser les lignes mais n'en as pas encore assez pour afficher. L'eventloop ne fait qu'attendre et rien ne se passe

    * sans exec() : tu sort du programme et cout va vider le buffer.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Pour utiliser la console avec Qt, et donc éviter ce genre de problèmes avec cout, tu peux utiliser QDebug !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include <QDebug>
     
     
    ....
     
     
    qDebug()<<"Ligne lue:"<<myLine ;
     
    ....

  5. #5
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Pour utiliser la console avec Qt, et donc éviter ce genre de problèmes avec cout, tu peux utiliser QDebug !
    qDebug() écrit sur la sortie erreur (stderr), donc visible sous Linux et Mac, mais pas sous Windows.

    L'utilisation d'un QTextStream lié au fichier standard stdout (standard) ou stderr (erreur) permet par contre de gérer l'ensemble quelque soit la plateforme.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Citation:
    Envoyé par Gulish
    Pour utiliser la console avec Qt, et donc éviter ce genre de problèmes avec cout, tu peux utiliser QDebug !

    qDebug() écrit sur la sortie erreur (stderr), donc visible sous Linux et Mac, mais pas sous Windows.

    L'utilisation d'un QTextStream lié au fichier standard stdout (standard) ou stderr (erreur) permet par contre de gérer l'ensemble quelque soit la plateforme.
    Il suffit d'ajouter dans le .pro.

    G.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Hmm, et pourquoi QTextStream::atEnd() retourne true avant de cout?
    En fait, je lis QTextStream dans un QApplication et je veux placer deux lignes de fichier aux deux QString-s. Mais parce que QTextStream::atEnd() retourne true, je ne vois aucun possibiliter de lire le fichier. Ou est le probleme, est-ce que mon utilisation de QTextStream est fausse?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par karastojko Voir le message
    Hmm, et pourquoi QTextStream::atEnd() retourne true avant de cout?
    il ne le fait pas.
    As tu essayer de faire du pas à pas?
    As tu compris comment fonctionne cout?

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Ok, oublie cout, pourquoi
    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
     
    Version::Version()
    {
    	QFile file(Version::filename);
    	if (file.open(QIODevice::ReadWrite | QIODevice::Text))
    	{
    		QTextStream fs(&file);
    		if (!fs.atEnd()) // (1)
    		{
    			this->version = fs.readLine();
    			this->build = fs.readLine();
    		}
    		else
    		{
    			this->version = "0";
    			this->build = "0";
    		}
    	}
    }
    ouvre le fichier nomme Version::filename mais condition (1) execute else branche au lieu de if? Meme si on ajoute seek(0) avant de ligne (1) le resultat ne change pas. Cette classe Version est utilise par QApplication.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Et si tu vire QIODevice::Text?

    Si ton fichier est écrit en unicode, il ne faut pas l'ouvrir en mode text, mais en mode binaire.
    Par exemple,un 00 représente un fin de fichier en mode text et non en mode binaire

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    La même chose et sans QIODevice::Text; le fichier n'est pas en Unicode. Il n'y a pas de problème avec des permissions parce que Bash script l'ouvre et lit comme demandé. Je n'ai aucune idée de quoi il s'agit il.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu es sur de la valeur de Version::filename?

    Comme tu ouvre en QIODevice::ReadWrite, si le fichier n'existe pas il le créé et tu te retrouve avec un fichier vide.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Oui, voilà de la classe entière.
    Version.hpp:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #ifndef VERSION_HPP
    #define VERSION_HPP
     
    #include <QString>
     
     
    /*
    This class is singleton.
    */
    class Version
    {
    private:
     
    	static Version* self;
     
    	static const QString filename;
     
    	QString version;
     
    	QString build;
     
    public:
     
    	Version();
     
    	static Version* getSelf();
     
    	QString getVersionNumber();
     
    	QString getBuildNumber();
    };
     
    #endif // VERSION_HPP
    Version.cpp
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include "Version.hpp"
    #include <QTextStream>
    #include <QFile>
     
     
    const QString Version::filename = "version.txt";
     
    Version* Version::self = NULL;
     
     
    Version::Version()
    {
    	QFile file(Version::filename);
    	if (file.open(QIODevice::ReadOnly))
    	{
    		QTextStream fs(&file);
    		//fs.seek(0);
    		if (!fs.atEnd())
    		{
    			this->version = fs.readLine();
    			this->build = fs.readLine();
    		}
    		else
    		{
    			this->version = "0";
    			this->build = "0";
    		}
    	}
    }
     
     
    Version* Version::getSelf()
    {
    	if (Version::self == NULL)
    		Version::self = new Version();
    	return Version::self;
    }
     
     
    QString Version::getVersionNumber()
    {
    	return this->version;
    }
     
     
    QString Version::getBuildNumber()
    {
    	return this->build;
    }
    Il n'y a pas de difference si on utilise QIODevice::ReadOnly ou QIODevice::ReadWrite - toujours le même résultat.
    Chaque build exécute d'abord un Bash script qui modifie le fichier version.txt et puis exécute make sur le projet. Donc, il n'y a pas de problème avec les permissions de version.txt, mais Qt ne veut pas le lire.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    const QString Version::filename = "version.txt";
    attention,
    ici tu ne sait pas dans quel répertoire il va chercher ton fichier.
    Ou est il situé? à côté de l'exe?

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Oui, à côté de l'executable, mais même si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const QString Version::filename = "./version.txt";
    il n'y a pas de progrès. (J'utilise Linux.)

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    et si tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const QString Version::filename = "version.txt"; 
     
    ...
     
     
    QFile file(QCoreApplication::applicationDirPath () + "/" +Version::filename);
    le problème c'est que l'execution n'est pas toujours dans le répertoire de l'exe

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Ha, c'est ça. Le problème existe quand application est mis en marche par KDE. Si on est marché de terminal, le problème n'existe pas.
    Merci beacoup pour ta patience de m'aider.

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    n'oublie pas le

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

Discussions similaires

  1. Fread ne lit pas tout le fichier
    Par jules_diedhiou dans le forum Langage
    Réponses: 1
    Dernier message: 15/07/2010, 14h49
  2. oucle qui ne lit pas la premiere ligne du fichier?
    Par areuh_fr dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2010, 09h22
  3. InternetReadFile ne lit pas les gros fichiers
    Par ValyGator dans le forum Windows
    Réponses: 6
    Dernier message: 06/11/2009, 06h55
  4. [XHTML] IE ne lit pas mon document valide
    Par Invité4 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 31/10/2004, 14h10

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