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 :

QFile + overflow


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 45
    Par défaut QFile + overflow
    Bonjour a tous,

    Je voudrais faire un slot "enregistrement" qui serait émi dés que l'ont appui sur une touche.
    Ce slot appelle ensuite une fonction pour écrire du texte dans un fichier.
    Mon problème est le suivent :
    Je voudrais placé dans le constructeur de mon QFile le chemin vers mon fichier.
    D'où 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    void MainWindow::enregistrement()
    {
    if (path == "")
        {
            enregistrer_sous();
        }
    else
    {
         int ligne2 = 0;
         int colonnes2 = 0;
     
         QString chemin = "C:/test.jyz";
     
         QFile file(chemin);
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
             return;
     
         QTextStream out(&file);
         out << colonnes << "\n" << "\n" << "\n" << "\n";
         file.close();
     
         while (colonnes2 < colonnes)
         {
                  ecriture(ligne2, colonnes2, chemin);
     
             ligne2++;
     
             if (ligne2 == 5)
             {
                 colonnes2++;
                 ligne2 = 0;
             }
         }
     }
    }
     
    void MainWindow::ecriture(int colonne, int ligne, QString chemin)
    {
         QFile file(chemin);
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
             return;
         QTextStream out(&file);
         out << modele->item(ligne, colonne)->text() << "\n";
         file.close();
    }
    Normalement ce slot devrait fonctionné, d'ailleurs mon fichier s'enregistre bien.
    Le problème est que juste a la fin de l'enregistrement le programme plante et est obligé de fermé !

    merci d'avance pour votre aide,

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Au niveau de quel ligne cela plante car comme ça je ne vois pas trop...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 45
    Par défaut
    En faite c'est assé bizard comme problème.
    Je pense que se qui fait planté mon programme se situe au niveau des instructions avec QFile.
    J'ai modifié mon 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    void MainWindow::enregistrement()
    {
    if (path == "")
        {
            enregistrer_sous();
        }
    else
    {
         int ligne2 = 0;
         int colonnes2 = 0;
     
         QString chemin= "test.jyz";
     
         QFile file("test.jyz");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
             return;
     
         QTextStream out(&file);
         out << colonnes << "\n" << "\n" << "\n" << "\n";
         file.close();
     
         while (colonnes2 < colonnes)
         {
                  ecriture(ligne2, colonnes2);
     
             ligne2++;
     
             if (ligne2 == 5)
             {
                 colonnes2++;
                 ligne2 = 0;
             }
         }
     }
    }
     
    void MainWindow::ecriture(int colonne, int ligne)
    {
         QFile file("tes.jyz");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
             return;
         QTextStream out(&file);
         out << modele->item(ligne, colonne)->text() << "\n";
         file.close();
    }
    Bon la sa marche !
    Mais lorsqu'au niveau des QFile, je veus mettre le QString path (qui contient le chemain complet vers mon fichier)
    Ba la sa plante !
    en gros si je mes un QString contenant une chaine de type "test.jyz" sa passe, mais si je mes "C:/test.jyz" la sa plante.

    EDIT : En fin de conte c'est pas sa.
    On dirait que des fois sa fonctionne et le plus souvent sa plante apres avoir enregistrer le fichier.
    Je sais pas trop d'où sa peut venir je sais que c'est dans ce slot...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Déjà, il y a de forte chance que cela vienne de votre code et non du QFile de Qt ... ou autre partie de Qt.

    Premier conseil, evitez de mettre un chemin en dur du genre "C:\fichier.jyz" ... car le C:\ c'est spécifique à Windows ( et Qt c'est normalement pour faire du multiplateforme ). Dans la classe QDir, il y a des méthode statique pour récupéré les informations du genre C:\ ( enfin la racine ( root ) ) et autres. Grace à la puissante classe QString, il est possible de construire une chaine de caractère ( donc un chemin pour un fichier ) dynamiquement et indépedement du système.

    Deuxièmement, pour vous aider dans le débugguage, vous pouvez soit utiliser un debuggeur et faire du pas à pas ( en regardant le contenu des variables ) soit, faire des std::cout un peu partout pour voir ce qui se passe ( méthode assez bourrine ). Pensez aussi à afficher les valeurs des variables.

    Je dirai qu'il y a un problème avec le while ( colonnes2 < colonnes ) qui se répercute dans la fonction ecriture ( ou même un problème interne à ecriture() ).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 45
    Par défaut
    Je crois savoir c'est quoi.
    En faite j'ai remarqué que quand je retire l'instruction :
    ecriture(ligne2, colonnes2);
    de ma boucle sa fonctionne...

    Sa m'oblige ainsi a ouvrir et fermé plusieurs fois mon fichier car je dois recupéré des donné contenu dans un tableau.

    Est ce le faite d'ouvrir et fermé plusieurs fois le meme fichier qui peut faire planté l'application ?

    Pour le QDir c'est une bonne idée mais je veus deja que sa fonctionne pour continué les améliorations...

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MainWindow::ecriture(int colonne, int ligne)
    {
         QFile file("tes.jyz");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
             return;
         QTextStream out(&file);
         out << modele->item(ligne, colonne)->text() << "\n";
         file.close();
    }
    Le problème est certainement au niveau de "modele->item(ligne, colonne)->text()". Y'a des pointeurs là dedans qui sont utilisés un petit peu au bonheur la chance, tu devrais faire quelques vérifs.

    Pour le reste, ton algo est quand même un petit peu "bourrin" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    file.close();
     
    while (colonnes2 < colonnes)
    {
        ecriture(ligne2, colonnes2);
    Dans ecriture(), tu récouvres le fichier à chaque fois... Il serait plus propre de passer le QTextStream que tu utilises en paramètre d'une nouvelle fonction, dans ce genre :

    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
         QFile file("test.jyz");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
             return;
     
         QTextStream out(&file);
         out << colonnes << "\n" << "\n" << "\n" << "\n";
         file.close();
     
         while (colonnes2 < colonnes)
         {
             ecriture(file, ligne2, colonnes2);
         // ...
    }
     
    void MainWindow::ajouteLigne(QTextStream & out, int colonne, int ligne)
    {
         out << modele->item(ligne, colonne)->text() << "\n";
    }
     
    void MainWindow::ecriture(int colonne, int ligne)
    {
         QFile file("tes.jyz");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
             return;
         QTextStream out(&file);
         ajouteLigne(out, ligne, colonne);
    }

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 45
    Par défaut
    Oui j'allais posté un message concernant cette ligne.
    Le debugger m'a egalement indiqué cette instruction.
    Pourtant
    modele->item(ligne, colonne)->text()
    Me renvoit bien un QString non ?
    J'ai essayer de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    item = modele->item(ligne, colonne);
    QMessageBox::information(this, "Auteur", "" + item->text());
    Mais sa plante quand même avant que la boite de dialogue s'ouvre...

    Faut que j'ecrive quoi pour obtenir le QString du QStandardItem de mon QStandardItemModel ?
    Je comprend pas pourquoi sa veut pas me renvoyé un QString, j'apelle pourtant la méthode adapté...

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par jyz93 Voir le message
    Je comprend pas pourquoi sa veut pas me renvoyé un QString, j'apelle pourtant la méthode adapté...
    Je pense que tout simplement la case que tu demandes (ligne, colonne) n'existe pas.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 45
    Par défaut
    Si elle existe étant donné que sa s'enregistre comme il faut dans mon fichier...

    Bon en d'autre therme, vous auriez pas un code pour recupéré le texte d'un QStandardItem de mon QStandardItemModel. Mon code fonctionne mais sa fait planté a la fin je sais pas pourquoi...

Discussions similaires

  1. TRIGGERS - String truncation ou numeric overflow
    Par AlBoLeToNo dans le forum InterBase
    Réponses: 5
    Dernier message: 21/09/2004, 12h58
  2. Réponses: 3
    Dernier message: 16/09/2004, 14h11
  3. [Erreur] buffer overflow
    Par cmoulin dans le forum Administration
    Réponses: 8
    Dernier message: 04/08/2004, 14h36
  4. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16
  5. [LG]floation point overflow
    Par mikoeur dans le forum Langage
    Réponses: 8
    Dernier message: 10/07/2003, 12h51

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