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 :

lecture erronée (QDataSream,QList<QVariant>, struct)


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut lecture erronée (QDataSream,QList<QVariant>, struct)
    Bonjour.

    J'ai un petit problème de lecture dans un fichier.

    Mon fichier binaire stock une liste de QVariant : QList< QVariant >

    Mes QVaraint sont de type structure : typedef struct FICHE{....}

    Pour résumer : Je n'ai aucune erreur de compilation , ni de warning

    Je défini ma struct dans un fichier.h globalement comme ceci:

    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
     
    ....
    #include <QVariant>
     
    typedef struct FICHE_HTable{
     
                            char tablename[15];
                            char players[15];
     
                }FICHE_HTable;
     
     
     
    Q_DECLARE_METATYPE(FICHE_HTable);
    ...
    Dans ma Fonction WriteToFile :

    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
     
    ....
        QList< QVariant > tables = mon_modele1->getListofTable(); 
     
        /////// Je test si une valeur dans ma fiche est correct.
        QVariant tbli;
     
        for(int i=0;i<tables.size();i++){   // Le nobre d'engresitrement est CORRECT!!!
            tbli= tables.value(i);
            FICHE_HTable fich = tbli.value<FICHE_HTable>();
     
            QMessageBox::information(&dialog, "info", fich.tablename);  //Ma valeur est CORRECT!!!
        }
        ///////
        QDataStream out(&file);
        out << tables;
    Dans ma Fonction ReadToFile :

    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
     
        QList< QVariant > tables;    //= mon_modele1->getListofTable();??? 
     
        QDataStream in(&file);
        in >> tables;    // Le nobre d'engresitrement est CORRECT!!!
     
        if (tables.isEmpty()) {   
            QMessageBox::information(&dialog, tr("No contacts in file"),
                tr("The file you are attempting to open contains no tables."));
        } else {
     
            for (int i=0; i<tables.size(); ++i) {  // Le nobre d'engresitrement est CORRECT!!!
     
                QVariant var = tables.at(i);
     
                FICHE_HTable fich = var.value<FICHE_HTable>();
     
                QMessageBox::information(&dialog, "information box",fich.tablename);  // Les valeurs de ma fich sont ERRONEE!!!
                addrowEntry(fiche.tablename, fiche.player, ); // Mon modele affiche également les meme valeurs ERRONEE de ma fiche
            }
    Cela fais 2 jours que j'essaye de récupérer des valeurs sous forme d'une fiche , pas moyen. j'ai suivi pourtant l'example de L'ADRESSE_BOOK et d'autre tres intéressant via ce forum.

    Je ne vois pas ce qui cloche ...

    Ou est l'erreur???

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Tu as implémenté les methode pour ecrire un FICHE_HTable dans un QDataStream ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par yan Voir le message
    Tu as implémenté les methode pour ecrire un FICHE_HTable dans un QDataStream ?
    Non, pourquoi ?

    Je ne peut pas affecter directement une QList < QVariant > dans un fichier sachant que chaque QVariant représente une struct FICHE_HTable?

    Or mon test juste avant d'écrire dans mon fichier sur un de mes QVariant dans la Qlist me rend bien une fiche avec des valeurs correctes.

    J'ai également essayer via un fichier texte.

    voici un copier coller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              
    FICHE_HTable        
    FICHE_HTable
    on y voit bien mes deux fiches, mais rien d'autre?

    Dans mon projet j'ai déja engresitrer des typedef struct FICH fich dans un fichier binaire avec succes, mais c'étais écris C.

    Mon but étais de tester QDataStream et une QList< QVariant >
    avec QVariant représentant ma struct FICHE_HTable ...

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par HadJack Voir le message
    Non, pourquoi ?
    par que je ne voi pas comment Qt puisse le faire pour toi
    http://qt.developpez.com/doc/4.6-sna...ing-qt-classes

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    Bonjour la communauté....

    Tu as implémenté les methode pour ecrire un FICHE_HTable dans un QDataStream ?
    J'ai enfin reussi à implémenter ces méthodes mais j'ai galérer GRAVE!!!

    De plus je ne suis pas content du résultat.

    La seule solution que j'ai trouvé, c'est celle ci :

    A l'Ecriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QDataStream & operator << (QDataStream & out, const  FICHE_HTable & Valeur)
    {                    
                out << Valeur.tablename
                     << Valeur.players     
            return out;
    }
    et dans la fonction Write to file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FICHE_HTable fich;
    out<< fich
    A la LECTURE:

    ce qui je comprends pas ici, c'est que j'ai du définir un " char* chaine " pour récupérer une valeur correcte : 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
    QDataStream & operator >> (QDataStream & in,  FICHE_HTable & Valeur)
    {
            QDialog dialog;
            char* chaine;
     
            in >> chaine;
            strcpy(Valeur.tablename,chaine);
            in >> chaine;
            strcpy(Valeur.players,chaine);
     
            QMessageBox::information(&dialog, "information box",fich1.tablename);
            QMessageBox::information(&dialog, "information box",fich1.players);
     
            return in;
    }
    Dans la fonction Read_From_File :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FICHE_HTable fich;
    in >> fich;
    Je trouve c'est maniéré d'écrire des structure très compliqué par rapport en C, c'est normale ou je m'y prend pas bien?

    De plus comment contrôler la fin du fichier et son nombre d'enregistrement?

    Est'il possible d'ecrire une QList< FICHE_HTable > dans mon fichier.

    Comment dois je implémenter les méthodes écriture et lecture correctement?

    Voila ,je bloque car je me demande si je vais pas réécrire mon code en C juste pour l'écriture et lecture de fichier binaire.

    Qu'en pensez vous ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QDataStream & operator >> (QDataStream & in, FICHE_HTable & Valeur)
    {                    
                in>> Valeur.tablename
                     >> Valeur.players     
            return in;
    }
    ne suffit pas ?????

    Citation Envoyé par HadJack Voir le message
    Voila ,je bloque car je me demande si je vais pas réécrire mon code en C juste pour l'écriture et lecture de fichier binaire.

    Qu'en pensez vous ?
    Que tu retourne du côté obscure et te dès que tu va vouloir lire tes fichiers sur un autres os.

    Si tu fait tout en C, tu va devoir gérer l'endian et la taille de tes données. Sinon, elle risque de ne pas être lisible partout. QDataStream Gère tous cela.

    Il est aussi préférable d'utiliser les types qt qui te garantisse la taille. Par exemple, au lieux d'un int pour un int 32 bits, utilise qint32.

    http://qt.developpez.com/faq/?page=F...ichier-binaire
    http://qt.developpez.com/doc/4.5/qtglobal/

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    [quote=yan;4651672]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QDataStream & operator >> (QDataStream & in, FICHE_HTable & Valeur)
    {                    
                in>> Valeur.tablename
                     >> Valeur.players     
            return in;
    }
    ne suffit pas ?????

    Non car j'obtiens l'erreur suivant :

    no match for 'operato>>' in in' >>Valeur->FICHE_HTable::tablename
    Pq je sais pas ...

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ha oui.
    tu utilise des tableaux de char....
    regarde bien
    http://qt.developpez.com/doc/4.6-sna...rator-gt-gt-12
    http://qt.developpez.com/doc/4.5/datastreamformat/

    Space for the string is allocated using new -- the caller must destroy it with delete[].
    Il te faut donc passer un pointer sur char qui sera initialisé par le >> et tu devra supprimer la mémoire ensuite...

    Faudrait mieux que tu utiliser une QString.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    Ok ca fonctionne avec des QString également mnt

    Mais il me reste toujours un problème suite à ce changement de char[] to QString.

    Ma Structure ne posséde plus une taille fixe car QString de taille variable et donc par conséquent si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nb_fiches = file.size()/x;
    x n'est pas constant et donc déterminer le nombre d'enregistrement et la fin du fichier d'après la taille du fichier pas possible.

    y'a t'il moyen de forcer mes QString à avoir une taille fixe?

    Ou bien une fonction pour détecter la fin du fichier?

    Et encore merci pour votre aide.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nb_fiches = file.size()/x;
    alors cela, je te le dé conseil fortement. C'est pas propre.

    Pourquoi as tu besoin de faire cela?
    Tu n'écrit pas un QVector<FICHE_HTable> ou similaire??

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 62
    Points : 34
    Points
    34
    Par défaut
    Au départ je voullais directement écrire et lire une QList < QVariant > dans le fichier.

    Actuellement j'écrit et lis des 3 QString l'une à la suite de l'autre équivalent à une fiche de struct FICHE_HTable et puis je reconstruit ma QList < QVariant > en passant ma struct FICHE_HTable sous un QVariant.

    je dois determiner le nobres d'engresitrement dans mon fichier pour determiner le nombres de fiches car une fiche contient les données d'une ligne(row) dans mon "QTableView" .

    A un moment donné je dois savoir le nombre de ligne à introduire dans ma table et donc savoir le nombre de fiches dans mon fichier.

    J' espere que c'est +- clair.

Discussions similaires

  1. [Google Maps] Lecture erronée polyline
    Par kriekbellevue dans le forum APIs Google
    Réponses: 2
    Dernier message: 04/09/2013, 17h42
  2. Lecture erronée de float dans un fichier binaire
    Par Bourrine dans le forum Langage
    Réponses: 10
    Dernier message: 23/05/2012, 09h12
  3. [Toutes versions] lecture donnée dans un onglet erronée
    Par crissud dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/04/2011, 15h29
  4. Creer une QList de struct
    Par Iaurkano dans le forum Qt
    Réponses: 3
    Dernier message: 21/03/2008, 09h06
  5. Pb lecture d'une struct date
    Par smag dans le forum C++
    Réponses: 13
    Dernier message: 03/03/2005, 22h17

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