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 :

[C++] problèmes avec fstream


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut [C++] problèmes avec fstream
    Bonjour,
    j'ai essayé pendent un moment d'utiliser Qt pour manipuler les fichiers (je m'en sert deja pour faire la GUI), mais, j'ai pas trouver de vrai bon tuto autre que la doc, et je m'y suis un peu perdu, alors j'ai decidé d'essayer fstream, enfin, ifstream.
    Je risque d'avoir plein de probleme donc je prepare le coup avec ce topic .
    Bon, pour commencer un tout bete :
    Dans le .h de ma classe, je le declare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           ifstream *fichier;
    Dans le .cpp, j'essaye de m'en servir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           fichier = new ifstream("poney/liste.txt", ios::in);
    Mais quand je compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            error: ISO C++ forbids declaration of 'fstream' with no type
    Voila, j'ai bien penser a inclure #include <iostream> et #include <fstream>

    PS : et dites, c'est quoi les balises a mettre pour la coloration syntaxique sur ce forum ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut, et bienvenue sur le forum.

    D'abord, il faut bien comprendre que les classes fournies par la bibliothèque standard sont toutes placées dans l'espace de nom std.

    Ainsi, quand tu veux déclarer un fichier d'entrée, il faut le déclarer sous la forme de
    ou, éventuellement (mais en faisant attention à l'endroit où tu le fait) en plaçant la directiveIl faut aussi savoir que, le plus souvent, on évitera d'avoir recours à un pointeur sur les différentes classes fournies par la bibliothèque standard: on leur préférera fortement l'utilisation des références, ne serait-ce que parce que la gestion des pointeurs et de l'allocation dynamique des éléments que cela sous-entend souvent est assez compliquée à mettre en oeuvre correctement

    Enfin, et pour répondre à ta dernière question, il suffit d'entourer le code les balises [ CODE ] et [ /CODE ] (en retirant les espace)

    Tu peux aussi avoir recours au bouton disponible lors de l'écriture de ton message
    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
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    std:: ?
    Sinon : NE JAMAIS UTILISER DE POINTEUR DE *fstream !!
    Le RAII c'est pas pour les cochons !

    Erf: grilled par un message 15 fois plus long ><
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Ah merci de vos reponses !
    j'ai pas penser au namespace, je m'en sert pas du tout dans mon programme et c'est la premiere fois que j'essaye d'ouvrir des fichiers en C++ , c'est un peu nouveau pour moi ^^ .
    J'ai un nouveau probleme !
    J'ai cette erreur :
    error: 'ios' has not been declared
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.open("poney/liste.txt", ios::in);
    C'est le meme qu'au dessus, avec les meme includes ^^


    Desolé, je savais pas qu'il falait pas faire de pointeur sur un fstream, pas tapé .
    Je le referai plus, promis ! ^^

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    ouaip, première règle du C++: ne pas utiliser de pointeurs sauf quand tu as une très bonne raison.

    Il y a une raison particulière pour laquelle tu utilises ton fstream dans le .h?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Non, j'ai lu les cours C++ sur le site et il declare tout dans le .h avant de l'utilisé dans le .cpp, donc je fais pareil, je devrai pas ?

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Si tu n'as pas mis le using namespace std, utilise std::ios::in.


    Sinon pour les pointeurs je ne suis pas d'accord, il y a plein de raison d'utiliser des pointeurs (compatibilité avec des libs C, argument d'une fonction C++ qui est un const char*, polymorphisme, pointeurs de fonction...).

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Sinon pour les pointeurs je ne suis pas d'accord, il y a plein de raison d'utiliser des pointeurs (compatibilité avec des libs C, argument d'une fonction C++ qui est un const char*, polymorphisme, pointeurs de fonction...).
    une bonne raison quoi.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    J'y avait penser mais j'ai mal vu, y avait une erreur en dessous qui y ressemblaie et j'ai cru que ça avait pas resolu le probleme, ça m'apprendra.
    Bon, ça c'est bon, maintenant j'ai une question bete, c'est est-ce que je peux reutiliser fichier ?
    j'ai fini avec mon liste.txt, je voudrais reutiliser fichier pour ouvrir un autre fichier, donc j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        for (i = 0 ; i < m_nbcheval + 1 ; i++)
        {
            fichier.open("poney/" + lines.at(i), std::ios::in);
            if(fichier)
            {
                while(getline(fichier, line))  // tant que l'on peut mettre la ligne dans "contenu"
                {
                    texte.fromStdString(line);
                    contenuFichiers[i] += texte;
                    i++;
                }
            }
            fichier.close();
        }
    Mais visiblement, reouvrir un fichier ça lui parle pas, voila l'erreure :
    error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::open(const QString, const std::_Ios_Openmode&)'

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    lines.at(i) semble renvoyer un QString. Il faut donc convertir ce QString en std::string.
    Pour cela, matte la doc de Qt.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    J'ai fait
    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
     
        for (i = 0 ; i < m_nbcheval + 1 ; i++)
        {
            texte = lines.at(i);
            fichier.open("poney/" + texte.toStdString(), std::ios::in);
            if(fichier)
            {
                while(getline(fichier, line))  // tant que l'on peut mettre la ligne dans "contenu"
                {
                    texte.fromStdString(line);
                    contenuFichiers[i] += texte;
                    i++;
                }
            }
            fichier.close();
        }
    Mais j'ai toujours cette erreure ...
    error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::_Ios_Openmode&)'

    Pourtant j'ai convertit, donc c'est pas ça, si ?

  12. #12
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    je ne sais pas si il existe des moyens plus simples :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.open(("poney/" + texte.toStdString()).c_str(), std::ios::in);

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Merci ça marche !
    j'avais du faire une erreur ^^ .
    ah c'est cool, ça m'avance bien !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Hop, j'ai rien dis, ça marche pas.
    J'ai essayé de le faire en plusieurs etape pour voir ce qui ne marchait pas, mais c'est toujours le open et la meme erreure.
    Je lui envoie un char* pourtant, non ?
    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
     
        for (i = 0 ; i < m_nbcheval + 1 ; i++)
        {
            texte = lines.at(i);
            line = "poney/" + texte.toStdString();
            fichier.open(line.c_str, std::ios::in);
            if(fichier)
            {
                while(getline(fichier, line))  // tant que l'on peut mettre la ligne dans "contenu"
                {
                    texte.fromStdString(line);
                    contenuFichiers[i] += texte;
                }
            }
            fichier.close();
        }
    Parce que, si j'ai bien compris, open attent un char*, donc ça devrai etre bon, non ?

    Decidement, la lecture de fichier, ça me reussi pas ^^ .

  15. #15
    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
    c_str(), pas 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.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    ah ah, ça me ferai presque rire si ça faisais pas une heure que je cherchais.
    Je crois que la prochaine fois je prendrai une douche AVANT de m'y mettre le matin -_-'.
    Merci !

    Maintenant, dernier probleme je pense avant que tout ne marche tres bien (je suis optimiste ce matin !), quand j'essaye d'acceder a contenuFichiers[i] , j'ai une segmentation fault.
    J'ai essayé d'acceder a contenuFichiers[0] pour voir, segmentation fault.
    Je le declare comme ça dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QStringList *contenuFichiers;
    Et ensuite dans le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenuFichiers = new QStringList[i];
    Sinon j'ai aussi essayé de le declaré directement dans le .cpp en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QStringList contenuFichiers[i]
    mais dans les cours et tutoriels pour apprendre C++ que j'ai lu sur le site, il disait qu'il fallait a tout prix eviter de declarer un tableau avec une variable, donc j'ai fait la premiere methode, mais j'ai la meme erreur dans les deux cas.

  17. #17
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut, la deuxième méthode marche bien aussi et est pratique quand on ne veut pas à avoir à gérer la destruction des tableaux.

    Tu peux afficher le contenu de la variable i?

    Coyotte507

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    i, c'est le compteur de la boucle :
    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
     
        for (i = 0 ; i < m_nbcheval ; i++)
        {
            texte = lines.at(i);
            line = "poney/" + texte.toStdString();
            fichier.open(line.c_str(), std::ios::in);
            if(fichier)
            {
                fichier.seekg(0, std::ios::beg);
                while(getline(fichier, line))  // tant que l'on peut mettre la ligne dans "contenu"
                {
                    texte = QString::fromStdString(line);
                    contenuFichiers[i] += texte;
                }
            }
            fichier.close();
        }
    Maintenant, ce code ne genere plus d'erreur, mais apres ça, quand je veux acceder a contenuFichiers, a n'importe quelle case, j'ai une segmentation fault :s .
    Et j'ai verifié, c'est bien contenuFichiers qui fait la segmentation fault ^^ .
    Donc si ma declaration est bonne, ça veut dire que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenuFichiers[1].at(0)
    qui plante.
    (j'ai mis 1 pour tester, mais n'importe quelle nombre c'est pareil).
    Et j'ai mis at(0) parce que cette ligne est cencé contenir un nom, mais je suppose que la segmentation fault veut dire qu'il n'y a rien a cet endroit ?

    Ah oui, j'ai oublier de preciser que contenuFichiers est une QStringList ^^

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Bon, pour essayé de voir la ou ça coincait j'ai essayé d'utiliser la sortie d'erreur.
    J'ai essayé d'afficher le contenu de i pour voir si ça rentrait dan la boucle while.
    Eh bien non, ça n'y rentre pas, comme on pourrait s'en douter.
    Donc j'ai chercher un peu, et j'ai trouver la methode clear() pour remettre les flags a leur etat d'origine, donc j'essaye ce 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
     
        for (i = 0 ; i < m_nbcheval ; i++)
        {
            fichier.clear();
            texte = lines.at(i);
            line = "poney/" + texte.toStdString();
            fichier.open(line.c_str(), std::ios::in);
            if(fichier)
            {
                while(getline(fichier, line))  // tant que l'on peut mettre la ligne dans "contenu"
                {
                    texte = QString::fromStdString(line);
                    contenuFichiers[i] += texte;
                    fprintf(stderr, "texte : %ld\n", i);
                }
            }
            fichier.close();
        }
    Et mon but, c'est de voir s'afficher dans ma console le contenue de i a chaque passage de la boucle.
    Avec ce code, je ne le voie pas.
    Si je met le fprintf en dehors du while par contre, ça marche.
    Donc le while retourne tout de suite 0, pourtant, la fonction clear devrait empecher ça, non ?

  20. #20
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    L'affichage marche même avec le fprintf dans ce bloc ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (fichier)
    {
       ...
    }
    Si c'est le cas, ça veut dire que ton fichier est vide o_O!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de copie avec fstream
    Par Nekkro dans le forum C++
    Réponses: 24
    Dernier message: 11/05/2012, 11h22
  2. Problème avec fstream
    Par Ziarrow dans le forum C++
    Réponses: 3
    Dernier message: 27/08/2010, 17h07
  3. Problème avec le header <fstream.h>
    Par micflor dans le forum Débuter
    Réponses: 7
    Dernier message: 18/12/2009, 12h06
  4. Problème avec fstream
    Par cach dans le forum SL & STL
    Réponses: 17
    Dernier message: 27/02/2005, 12h28
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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