Partage
  • Partager sur Facebook
  • Partager sur Twitter

utiliser plusieurs fois la meme fonctions

un probleme lors du deuxieme appelle de la fonction

Sujet résolu
    9 juillet 2007 à 19:01:54

    j'ai une fonction appartenant à une class nomé fichier.

    #define _F m_nomFichier.c_str()
    std::string fichier::lire(long numeroLigne,long ligneAlire)
    {
    if(m_testOuverture)
    {auto string ligne1,ligne2;
    m_lecture.open(_F,ios::in);

    do{
    getline(m_lecture,ligne1);
    numeroLigne--;
    }while(numeroLigne);

    while(ligneAlire>1)
    {ligneAlire--;
    getline(m_lecture,ligne2);
    ligne1+=("\n"+ligne2);
    m_lecture.close();
    }
    return ligne1;}//fin if
    else{
    m_ecriture.open("fichier erreur.txt",ios::out|ios::app);
    m_ecriture<<"Veuillez definir le nom du fichier avant de le lire!!"<<endl;
    m_ecriture.close();
    return "erreur de lecture...";}
    }


    cette fonction marche bien: elle me lit bien la/les lignes souhaité
    mais si dans mon main je fait:(FF,variable de type ficher)
    le contenu de mon fichier est
    ma premiere ligne
    ma deuxieme ligne
    me troisieme ligne


    cout<<"("<<FF.lire(1)<<")"<<endl;//deuxieme parametre facultatif (=1)
    //on lit la premier ligne.
    cout<<"("<<FF.lire(2)<<")"<<endl; //on lit la deuxieme ligne
     


    voila ce qui s'affiche sur mon ecran...
    (ma premiere ligne)
    ()
    appuyer sur une touche pour continuer


    cela arrive à toutes mes fonctions utilisant ifstream...

    pourquois??? o_O



    EDIT:si il y a quelque chose de pas clair faites le savoir :D

    mercide me répondre ^^
    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2007 à 19:35:55

      Citation : neuneutrinos

      j'ai une fonction appartenant à une classe nommée fichier.



      On appelle ça une méthode.

      Sinon pour ta question, j'ai peut-être une réponse. Après le premier appel, "l'ordinateur" se trouve à la fin de la première ligne. Donc quand tu veux lire la 2ème, il va en réalité aller lire la 3ème qui est vide.

      Mais je suis pas sûr du tout de ce que je te dis. Essaye d'appeler qu'une fois la méthode avec le paramètre 2 et regarde si ça marche.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        9 juillet 2007 à 19:44:52

        as-tu testé de lire la 2e ligne en premier?
        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2007 à 20:30:51

          oui si je met FF.lire(2) en premier ca marche

          l'histoire du curseur dans le fichier...
          j'y ai pensé... et j'avais rajouter

          m_lecture.open(_F,ios::in);
          if(!m_lecture.tellg())//si on est pas au debut de fichier
          m_lecture.seekg(0,ios::beg)//je remet le curseur au debut du fichier
          ...


          mais rien a changé donc je l'ai enlevé...
          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2007 à 2:37:35

            Citation : Nanoc

            Citation : neuneutrinos

            j'ai une fonction appartenant à une classe nommée fichier.



            On appelle ça une méthode.


            Non. Il n'y a pas de "méthode" en C++. On appelle ça une "fonction membre" si on veut être précis. "fonction" c'est très bien aussi.


            Sinon, je ne vois pas l'intérêt de ces deux paramètres. Tu veux lire la ligne N°i ? =>
            // non testé
            std::string getLine(unsigned int L /*index démarrant à 0*/, istream & is) {
                unsigned int i=0;
                for (
                    ; i!=L && is.ignore(std::numeric_limits<int>::max(), '\n' )
                    ; ++i)
                {}
                if (i != L)
                   throw std::runtime_error("There is not enough lines");
                std::string res;
                if (! std::getline(is, res))
                   throw std::runtime_error("Cannot read the ith line");
                return res;
            }
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              10 juillet 2007 à 10:38:26

              dès que je serais me servir de istream je testerais cette fonction etrange...
              dans quel fichier lit tu???
              les messages d'erreurs sont il envoyé à la meme fonction???

              j'ai vu que la fin de la fonction main fermait implicitement les fichier.
              je vais donc creer un constructeur prenant en parametre le nom du fichier et ouvrire le fichier en lecture avec m_lecture et en ecriture avec m_ecriture.
              mais je ne connais pas le resultat finale...

              EDIT: meme résultat...
              • Partager sur Facebook
              • Partager sur Twitter
                10 juillet 2007 à 22:23:45

                std::ifstream est un std::istream, et std::fstream (aussi peu utilise soit-il) est à la fois un std::ifstream et un std::ofstream (et donc un std::istream et un std::ostream).

                Du coup, la fonction s'utilise de la sorte:
                #include <string> // std::string
                #include <fstream> // std::isftream et indirectement std::istream
                #include <stdexcept> // std::runtime_error
                #include <iostream> // std::cout, std::cin, std::cerr

                ..... getLine ....

                int main() {
                    try {
                        std::ifstream f("toto.txt");
                        if (!f) throw std::runtime_error("Cannot open toto.txt");
                        unsigned int L;
                        while (std::cout << "Which line?\n->", std::cin>>L) {
                           std::string sLine = getLine(L, f);
                           std::cout << "Line #" << L << " is: " << sLine << "\n";
                        }
                        return EXIT_SUCCESS;
                    } catch(std::exception const& e) {
                        std::cerr << "Error: " << e.what() << std::endl;
                    }
                    return EXIT_FAILURE;
                }

                (s'arrête avec un ctrl-D (*nix/cygwin) ou ctrl-Z (windows))
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                  12 juillet 2007 à 18:07:18

                  j'ai hyoper simplifié ma class et je vous donne tout:
                  fichier.h

                  #include <fstream>
                  class fichier
                  {std::ifstream m_lecture;//pour lire un fichier
                  public:
                  std::string lire(char* nomFichier);//cette fonction va juste lire la premiere ligne ^^
                  };


                  fichier.cpp

                  #include "fichier.h"
                  using namespace std;
                  string fichier::lire(char* nomFichier)//je part du principe que le fichier existe ^^
                  {string ligne="";
                  m_lecture.open(nomFichier,ios::in);
                  getline(m_lecture,ligne);
                  return ligne;
                  m_lecture.close();
                  }

                  main.cpp

                  #include <iostream>
                  #include "fichier.h"
                  using namespace std;
                  int main(int argc, char *argv[])
                  {fichier test;
                  cout<<test.lire("fichier.txt")<<endl;
                  cout<<test.lire("fichier.txt")<<endl;
                  system("PAUSE");
                      return EXIT_SUCCESS;
                  }


                  tester ce code et vous cerrez apparaitre un bug
                  si j'ai un fichier: fichier.txt.
                  on y lit:
                  ligne1
                  ligne2
                  ligne3


                  mon programme affichera
                  ligne1

                  appuyez sur une touche pour continuer...



                  pourquois ce bug avec ifstream??


                  edit

                  pardon pour la premiere fois car mauvais affichage
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juillet 2007 à 18:15:39

                    Ton erreur est simple.


                    //.....blablabla...
                    return ligne;
                    m_lecture.close()//Cette ligne là n'est pas exécutée car elle est après le return
                                        //Le fichier n'est donc pas fermer 
                     
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                      12 juillet 2007 à 18:22:41

                      :lol: du café... il me faut du café :lol:

                      je ne vais pas bien sans mon café ^^
                      merci encore
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 juillet 2007 à 23:08:45

                        Pourquoi ouvrir et fermer à chaque fois ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                        utiliser plusieurs fois la meme fonctions

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown