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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 confirmé
    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
    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 confirmé
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

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