Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec getline en fstream

    10 juillet 2019 à 14:09:26

    Bonjour, je suis actuellement en train de suivre le cours :"Programmez avec le langage C++, PARTIE I, Chapitre 9 : Lisez et modifiez des fichier",j'ai deux erreurs dans mon programme :

    #include <iostream>
    #include <vector> //Ne pas oublier !
    #include <fstream>
    #include <sstream>
    #include <string>
    using namespace std;
    
    int main()
    {
    string const nomFichier("C:\\Users\\bejasam\\Desktop\\Lecture_Ecriture\\notes.txt");
    ofstream monFlux(nomFichier.c_str());
    
        if(monFlux){
        
            double x;
            int nbNotes=0;
            double moyenne=0;
            vector<double>notes;
            string ligne;
            int ss;
            while(getline(monFlux,ligne))
                {
                istringstream ss(ligne);
                notes.push_back(ss);
                }
            do{
                cout<<"Entrez une note entre 1 et 6 pour comptabiliser la note, sinon entrez un autre nombre.\n";
                cin>>x;
                notes.push_back(x);
                if(x>0&&x<=6)
                    {
                    notes.push_back(x);
                    monFlux<<x<<endl;
                    nbNotes++;
                    };
              }
              while(x>0&&x<=6);
              for(int i(0);i<notes.size();i++)
                    {
                    cout<<notes[i]<<endl;
                    moyenne+=notes[i];
                    }
            moyenne/=nbNotes;
            cout<<"Votre moyenne est : "<< moyenne << endl;
        }
        
        }
    
     



    C:\Users\bejasam\Desktop\Applications test avant cours\Tableaudenotes\main.cpp:21: erreur : no matching function for call to 'getline(std::ofstream&, std::__cxx11::string&)'

         while(getline(monFlux,ligne))

    C:\Users\bejasam\Desktop\Applications test avant cours\Tableaudenotes\main.cpp:24: erreur : no matching function for call to 'std::vector<double>::push_back(std::istringstream&)'

             notes.push_back(ss);

    pourriez vous m'aider s'il vous plait ?

    -
    Edité par SamyBejaoui 10 juillet 2019 à 14:14:28

    • Partager sur Facebook
    • Partager sur Twitter
      10 juillet 2019 à 15:08:09

      Pour lire un fichier, c'est ifstream, pas ofstream (qui lui sert à écrire).

      Pour la seconde erreur, ss est un"istringstream" déclaré dans la portée supérieur comme un int.

      Du coup tu ne peux pas le push dans un vector<double>

      Au passage j'en profite pour te dire d'éviter d'utiliser "using namespace std;" mais de plutôt utiliser les noms compelts comme "std::cout, etc...".

       EDIT : fail du coup mon message est en partie rouge ^^'.

      -
      Edité par Zaap98 10 juillet 2019 à 15:12:23

      • Partager sur Facebook
      • Partager sur Twitter
        10 juillet 2019 à 15:12:28

        Zaap98 a écrit:

        Pour la seconde erreur, ss est un int, que tu push dans un tableau de doubles.

        Dans le bloc, c'est même un istringstream.

        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2019 à 15:24:53

          Merci a vous deux de la réponse, le but du programme étant de pouvoir consulter et prendre en compte les notes contenues dans le fichier et de pouvoir enregistrer dans le fichier les nouvelles notes tout en les comptabilisant, la getline etant la seule ligne que je connaisse pour extirper des lignes d'un fichier, j'aurais voulu savoir si je pouvais tout simplement prendre les lignes en tant que double plutot que de les prendre en string et de les convertir ensuite en double. (J'ai appliqué vos modifications, je reposte le code modifié dans deux minutes)

          #include <iostream>
          #include <vector> //Ne pas oublier !
          #include <fstream>
          #include <sstream>
          #include <string>
          
          
          int main()
          {
          std::string const nomFichier("C:\\Users\\bejasam\\Desktop\\Lecture_Ecriture\\notes.txt");
          std::ofstream monFluxo(nomFichier.c_str());
          std::ifstream monFluxi(nomFichier.c_str());
          
              if(monFluxi){
          
                  double x;
                  int nbNotes=0;
                  double moyenne=0;
                  std::vector<double>notes;
                  std::string ligne;
                  double ss;
                  while(std::getline(monFluxi,ligne))
                      {
                      std::istringstream ss(ligne);
                      notes.push_back(ss);
                      }
                  do{
                      std::cout<<"Entrez une note entre 1 et 6 pour comptabiliser la note, sinon entrez un autre nombre.\n";
                      std::cin>>x;
                      notes.push_back(x);
                      if(x>0&&x<=6)
                          {
                          notes.push_back(x);
                          monFluxo<<x<<std::endl;
                          nbNotes++;
                          };
                    }
                    while(x>0&&x<=6);
                    for(int i(0);i<notes.size();i++)
                          {
                          std::cout<<notes[i]<<std::endl;
                          moyenne+=notes[i];
                          }
                  moyenne/=nbNotes;
                  std::cout<<"Votre moyenne est : "<< moyenne << std::endl;
              }
          
              }
          

          EDIT : Rajout du code

          -
          Edité par SamyBejaoui 10 juillet 2019 à 15:31:28

          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2019 à 15:35:38

            SamyBejaoui a écrit:

            getline etant la seule ligne que je connaisse pour extirper des lignes d'un fichier, j'aurais voulu savoir si je pouvais tout simplement prendre les lignes en tant que double.

            Il y a aussi le double chevron >> 

            Tu devrais faire ton code en plusieurs partie (fonction si tu as vu), là c'est tout mélangé on y vois rien.

            Attention quand tu lis ou écris dans les fichier à utiliser le bon flux (lecture ou écriture) 

            • Partager sur Facebook
            • Partager sur Twitter
              10 juillet 2019 à 15:50:25

              En fait je crois que tu confonds cast et constructeur.

              À la ligne 24, remplace cette ligne par : ss=stod(ligne);

              Sinon il existe aussi un moyen d'ouvrir un fichier en lecture ET en écriture en même temps.

              Je ne peux que te recommander de ne pas suivre le tuto d'OCR sur le C++ aussi.

              -
              Edité par Zaap98 10 juillet 2019 à 15:50:34

              • Partager sur Facebook
              • Partager sur Twitter
                10 juillet 2019 à 16:00:40

                EDIT : Veuillez m'excuser, le code que j'ai renvoyé n'était pas mon intention, j'avais du le mettre en doublon en écriture de message et il a du se poster quand j'ai actualisé la page.

                Je prends tout de suite vos conseil en compte et vous en remercie, je reviendrais demain après avoir modifié et simplifié le code.

                Si vous pouviez s'il vous plait me donner des conseils sur la transformation d'un string en une valeur numérique.

                -
                Edité par SamyBejaoui 10 juillet 2019 à 20:42:09

                • Partager sur Facebook
                • Partager sur Twitter
                  10 juillet 2019 à 16:08:32

                  Ligne 25 notes.push_back attend un double pas un flux de chaîne.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juillet 2019 à 16:12:22

                    Avant de reposter ton code applique les modifications que je t'ai dites.

                    EDIT : string en int -> utilise stoi() (de #include <string>)

                    ex: int a=stoi("32");

                    a==32

                    -
                    Edité par Zaap98 11 juillet 2019 à 10:52:21

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème avec getline en fstream

                    × 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