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

 C++ Discussion :

Problème avec ofstream et >>


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut Problème avec ofstream et >>
    Bonjour à tous,

    je suis débutant en C++ et j'essaie actuellement de porter dans ce langage un programme que j'ai déjà créé en VB grâce à Qt. Ce programme permet de trouver des mots à partir de lettres en ajoutant des détails (vous pouvez voir plus de détails ici). J'ai donc créé un projet Qt, créé une fenêtre et écrit différents trucs, notamment une classe contenant un énorme dictionnaire. Celui ci doit être lors de l'initialisation de l'objet être mis dans un tableau (vector) puis être retourné à la classe qui a créé cet objet (qui récupère ainsi un tableau contenant le dictionnaire). L'intérêt est que le fichier est énorme, et donc fait planter sans arrêt Qt, ainsi en le mettant dans un objet à part que je ne modifie pas, je garde la stabilité de l'éditeur. Cependant j'obtiens cette erreur :

    ((dictionnaireIntegre*)this)->dictionnaireIntegre::dictionnaire' does not have class type
    Mes fichiers :

    main.cpp : http://pastebin.com/TJQj9t3E
    fenetrePrincipale.cpp : http://pastebin.com/77JDL5tn
    fenetrePrincipale.h : http://pastebin.com/Hp1n8Thn
    dictionnaireintegre.cpp : http://thomaskowalski.net/fichiers/f...ireintegre.cpp
    dictionnaireintegre.h : http://pastebin.com/BHUmKGF7

    ou alors tout le projet : http://thomaskowalski.net/fichiers/f...principale.zip

    Pourriez vous me dire ce qui ne va pas dans mon code ? A chaque problème j'ai trouvé un truc qui empêchait l'erreur mais là je ne vois pas..

    Merci d'avance

    Thomas

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    En C++, il est généralement conseillé de traiter les erreurs de compilation exactement dans l'ordre dans lequel elles arrivent.

    Il arrive en effet régulièrement que la première erreur rencontrée soit à l'origine de la suivante, qui sera à l'origine de la suivante, et ainsi de suite, ce qui peut résulter en... un nombre particulièrement important d'erreur.

    Comme tu parles, dans le titre, d'"erreurs par milliers", il serait pour le moins sympa de ta part d'essayer de nous donner les deux ou trois premières erreurs, cela nous aiderait énormément à cerner le problème.

    La première chose qui m'inquiète, c'est la déclaration de dictionnaire que tu fais dans le fichier d'en-tête dico.h.

    En effet, cette déclaration déclare... une fonction qui est sensée renvoyer un std::vector<std::string>.

    Or, je présumes que tu voudrais plutôt que ta classe dictionnaireIntegre (qui, pour bien faire, devrait bien plus se trouver dans un fichier nommé "dictionnaireIntegre.h" que dans dico.h) dispose d'un membre qui soit de type std::vector<std::string> et que ce membre soit appelé dictionnaire. Me trompes-je

    Si je ne me trompes pas, supprimes peut etre simplement les deux parenthèses à la fin de cette déclaration, cela devrait corriger pas mal de choses.

    Si je fais cette supposition, c'est parce que j'ai une connexion internet particulièrement lente pour l'instant, et que j'ai du mal à télécharger le fichier dictionnaireIntégré.cpp.

    Ceci dit, il faut avouer qu'avoir un fichier d'implémentation de près de 14Mb a de quoi nous surprendre énormément: je me demande bien ce que tu as pu mettre dans ce fichier, alors que ta classe n'est composée que... de trois fonctions qui semblent relativement simple
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Bon...

    Ayant (enfin) pu ouvrir le fichier en question, je confirme: dictionnaire est sensé etre un membre de dictionnaireIntegre et non une fonction.

    Je confirme donc ma première impression: supprimes, simplement, les parenthèses à la fin de la déclaration, cela ira beaucoup mieux

    En outre, le millier d'erreur que tu obtiens n'est, très certainement, que la répétition de la même erreur un nombre de fois correspondant au nombre d'éléments que tu essayes de mettre dans dictionnaire.

    Tu aurais très largement intérêt à créer un fichier séparé qui ne contiendrait que les mots, et que tu lirais en boucle afin d'ajouter les mots à dictionnaire.

    Cela présenterait de nombreux avantages, parmi lesquels:

    Le fait que tu n'aurais eu qu'une seule erreur de compilation si tu avais utilisé une boucle pour l'insertion d'éléments lus "par ailleurs"
    Le fait que tu ne devras pas venir modifier les sources de dictionnaireIntegre, et donc tout recompiler, "simplement" pour pouvoir rajouter un mot entre abaisseras et abaissèrent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    Merci pour cette réponse rapide, en effet je n'aurais pas dû mettre des parenthèses. Je vais résoudre ce problème et vérifier que ça fonctionne
    PS : Effectivement, c'était toujours le même message d'horreur.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    J'ai résolu ce problème et finalement décidé d'utiliser un fichier dictionnaire plutôt que de le mettre directement dans le programme
    Voilà donc mes nouveaux fichiers :
    dico.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
    #include "dico.h"
     
    Dico::Dico()
    {
    }
    Dico::~Dico()
    {
    }
    bool
    Dico::load(const std::string& filename)
    {
       std::ofstream file(filename.c_str());
       if (!file)
        return false;
      std::string line;
      while (file >> line)
        _dico.push_back(line);
      return true;
    }
    const std::string&
    Dico::operator[](int i) const
    {
      return _dico[i];
    }
    int
    Dico::size() const
    {
      return _dico.size();
    }
    dico.h
    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
    #ifndef DICO_H
    #define DICO_H
     
    #include <vector>
    #include <fstream>
     
    class Dico
    {
    public:
         Dico();
         ~Dico();
         bool load(const std::string& filename);
         const std::string& operator[](int i) const;
         int size() const;
    private:
        std::vector<std::string> _dico;
    };
     
    #endif // DICO_H
    fenetrePrincipale.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
    #include "fenetreprincipale.h"
    fenetrePrincipale::fenetrePrincipale(QWidget *parent) : QWidget(parent)
    {
        resultats = new QTextEdit();
        nombreDeLettres = new QSpinBox();
        lettresDisponibles = new QLineEdit();
        boutonRechercher = new QPushButton("Rechercher des mots");
        formulaire = new QFormLayout();
        conteneur = new QHBoxLayout();
        grandConteneur = new QVBoxLayout();
     
        Dico Dictionnaire;
        Dictionnaire.load("coucou.txt");
     
        formulaire->addRow("Nombre de lettres dans le mot : ", nombreDeLettres);
        formulaire->addRow("Lettres disponibles : ", lettresDisponibles);
     
        conteneur->addLayout(formulaire);
        conteneur->addWidget(resultats);
     
        grandConteneur->addLayout(conteneur);
        grandConteneur->addWidget(boutonRechercher);
        this->setLayout(grandConteneur);
    }
    Mais j'obtiens cette erreur...
    Ligne 16 : no match for 'operator>>' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' and 'std::string {aka std::basic_string<char>}')
    Une idée ?..

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu cherches à lire depuis un fichier ouvert en sortie (ofstream).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    Effectivement, finalement j'ai mis un fstream et ça va mieux, mais depuis le problème c'est que je sais pas si le dictionnaire s'est chargé ou pas, du coup j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dico Dictionnaire;
        Dictionnaire.load("coucou.txt");
        boutonRechercher->setText(new QString(Dictionnaire[4]));
    pour tester mais il me fait une erreur sur la troisième ligne :
    no matching function for call to 'QString::QString(const string&)'

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il suffit de quelques secondes sur Google pour voir que QString n'a pas de constructeur acceptant une std::string en paramètre.
    Tu dois lui passer un const char*, comme celui retourné par std::string:c_str().

    De plus, le "new" est inutile, QButton::setText() prend son paramètre par référence constante.

    Vu que le constructeur de QString() est probablement implicite, ceci devrait être amplement suffisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boutonRechercher->setText(Dictionnaire[4].c_str());
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    Bon, maintenant le programme se lance mais crash au démarrage (a cessé de fonctionner)

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Est ce que les dll propres à Qt sont dans un dossier qui est bien accessible depuis la variable PATH
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    Non pourquoi ?
    De toute façon, je sais que si j'enlève ce passage du code, le programme démarre donc ça doit pas être un souci d'accès aux DLL de Qt...

    EDIT : Par contre si j'essaie de le lancer depuis le dossier debug, on me dit qu'il manque qt5core.dll

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Pouknouki Voir le message
    Non pourquoi ?
    De toute façon, je sais que si j'enlève ce passage du code, le programme démarre donc ça doit pas être un souci d'accès aux DLL de Qt...
    Sans plus d'informations, il fallait que je pose la question
    EDIT : Par contre si j'essaie de le lancer depuis le dossier debug, on me dit qu'il manque qt5core.dll
    Ca, c'est sans doute parce que tu travailles avec une variable PATH modifiée de manière locale pour ton EDI, mais que le chemin d'accès aux dll de Qt n'est pas défini de manière globale pour l'ensemble de ton système.

    Il ne faut pas *trop* s'en faire pour cela dans un premier temps d'autant plus que les solutions vont simplement de copier toutes les dlls que le système te dira ne pas trouver en double cliquant sur l'exécutable (il risque de te dire au minimum qu'il ne trouve pas qt5Gui.dll) dans le dossier debug à quelque chose de plus définitif comme le fait de modifier la variable PATH dans le panneau de configuration.

    Considérons donc pour l'instant que tu ne devras lancer l'application qu'en passant par ton EDI préféré

    Et, comme tu auras justement besoin de ton EDI pour pouvoir trouver la source de ton problème, tout est, pour l'instant du moins "pour le mieux"

    Car, et c'est peut etre la mauvaise nouvelle de la journée, lorsqu'une application "plante" comme cela sans précision au démarrage, il n'y a pas grand chose d'autre à faire que de... faire chauffer le débuggeur

    Essayes de lancer ton application en pas à pas, et de trouver l'endroit où le système se vautre. Dans un premier temps, je ne saurais être plus précis parce que rien dans le code que tu nous présent ne semble etre la cause de ce problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Problème avec Ofstream
    Par azeglaoui dans le forum SL & STL
    Réponses: 18
    Dernier message: 12/10/2009, 21h17
  2. problème avec ofstream
    Par rodgeurette dans le forum SL & STL
    Réponses: 4
    Dernier message: 18/07/2007, 14h02
  3. Problème avec ofstream et ios::app
    Par Clad3 dans le forum SL & STL
    Réponses: 8
    Dernier message: 07/01/2007, 12h10
  4. problème avec ofstream::write
    Par b4u dans le forum SL & STL
    Réponses: 3
    Dernier message: 01/06/2006, 14h17
  5. [C++] Problème avec ofstream
    Par Mathieu.J dans le forum SL & STL
    Réponses: 4
    Dernier message: 27/03/2006, 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