Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aller a une ligne d'un fichier

C++

Sujet résolu
    11 février 2011 à 14:26:59

    Bonjour,

    Je souhaiterais savoir (en C++) comment on fait pour aller à une ligne choisie d'un fichier .txt

    Demandez moi plus d'informations si nécessaire.

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2011 à 14:28:35

      Il faut les lire toutes avant. Tu n'as pas le choix.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        11 février 2011 à 14:31:34

        Salut,

        Mais il n'est pas possible d'inscrire sur ma console seulement la ligne que je demande?

        Par exemple on demande a l'utilisateur un numéro et le programme affiche à l’écran ce qui écrit a la ligne choisie par l'utilisateur ?

        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2011 à 14:37:16

          La lecture d'une ligne n'implique pas son affichage.
          • Partager sur Facebook
          • Partager sur Twitter
            11 février 2011 à 14:37:20

            Si, tu peux écrire que celle que tu veux.

            Mais pour aller la chercher dans le fichier, tu es obligé de le parcourir, et lire chaque ligne, quit a ne pas les garder en mémoire, ne garder que la i_ième que tu veux :)
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              11 février 2011 à 14:41:10

              Salut, mais comment j’insère ma variable de type int dans mon code ?

              j'ai ça : (tiré du tuto)

              while(fichier)
                      {
                          string ligne;
                          getline(fichier, ligne);
              
                          cout << ligne << endl;
                      }
              
              • Partager sur Facebook
              • Partager sur Twitter
                11 février 2011 à 14:46:46

                Par exemple :

                int cpt = 0;
                
                while(fichier)
                        {
                            string ligne;
                            getline(fichier, ligne);
                            cpt++;
                            if (cpt == 7)
                                cout << ligne << endl;
                        }
                
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  11 février 2011 à 14:49:42

                  ok merci beaucoup je vais essayer ça.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 février 2011 à 14:55:52

                    Arg. Le tuto a une erreur sur la lecture des lignes. J'espère que cela sera patché prochainement.
                    Sinon, on peut procéder de la sorte, qui sera un chouilla plus efficace que de jouer avec getline.
                    // syntaxe de mémoire
                    for (size_t i=0; i<n && fichier.ignore(std::numeric_limit<std::streamsize>::max(), "\n") ; ++i)
                    {}
                    std::string ligne;
                    if (std::getline(fichier, ligne) {
                        cout << "La " << (n+1) << "e ligne est :" << ligne << "\n";
                    }
                    
                    • 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.
                      11 février 2011 à 15:05:02

                      ok merci à tous pour vos réponses j'ai essayé la solution de Fvirtman ça marche nikel.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 février 2011 à 15:11:15

                        Il reste à espérer que tu ne veuilles pas afficher la première ligne de la Bible.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 février 2011 à 15:27:49

                          (sauf qu'il faut tester getline après l'avoir utilisé ... teste avec le nombre de lignes du fichier plus +1 pour constater le bug)
                          • 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.
                            1 août 2011 à 17:07:50

                            malekith25, lmghs a raison. J'ai moi-même eu ce problème sa méthode est optimale tu devrais l'adopter. Voici un tutoriel très utile pour compléter celui de m@théo21 et nanoc. Dans l'exemple de fin de ce tutoriel j'ai ajouter un bout de code qui extrait une ligne particulière dans un texte conformément à la méthode de lmghs:
                            #include <iostream>
                            #include <fstream>
                            #include <string>
                            #include <limits>  // pour utiliser numeric_limits<int>::max()
                            
                            using namespace std;
                            
                            int main()
                            {
                                    string toto = "toto.txt";
                                    ifstream fichier_toto(toto.c_str(), ios::in);
                            
                                    if(fichier_toto.fail())
                                            cout << "Le fichier " << toto << " n'existe pas !" << endl;
                            
                                    ifstream fichier("D:/docs/cours/test.txt", ios::in);
                            
                                    if(!fichier.fail())
                                    {
                                            cout << "Le fichier existe bien et est correctement ouvert !" << endl;
                                            cout << "A l'ouverture du fichier, le curseur de trouve a l'octet " << fichier.tellg() << "." << endl << endl;
                                            cout << "Le fichier contient : " << endl << endl;
                            
                                            string ligne;
                                            while(getline(fichier, ligne))
                                                    cout << ligne << endl;
                            
                                            cout << endl << "Une fois tout le fichier lu, le \"eofbit\" est passe a " << boolalpha << fichier.eof() << "." << endl;
                            /* boolalpha sert à afficher en toutes lettres un booléen */
                            
                                            cout << endl << "Pour revenir au debut du fichier, on peut tenter un \"fichier.seekg(0, ios::beg\". Est-ce que ca a fonctionne ?" << endl;
                            
                                            fichier.seekg(0, ios::beg);
                            
                                            cout << endl << "On se trouve au " << fichier.tellg() << "ieme octet." << endl;
                            
                                            if((int)fichier.tellg() != 0)
                                            {
                                                    cout << "Oh non, ca n'a pas fonctionne ! Je vais tenter de faire un \"fichier.clear()\"." << endl;
                                                    fichier.clear();
                                                    fichier.seekg(0, ios::beg);
                                                    cout << endl << "On se trouve au " << fichier.tellg() << "ieme octet." << endl;
                                            }
                            
                                            int nbLignes(0);
                                            while(fichier.ignore(numeric_limits<int>::max(), '\n'))
                                                nbLignes++;
                            
                                            cout << "Le fichier contient " << nbLignes << " lignes." << endl;
                            
                                            cout << "Comme on a parcouru a nouveau le fichier, le \"eofbit\" est passe a " << boolalpha << fichier.eof() << "." << endl;
                                            cout << "Faisons à nouveau \"fichier.clear()\"." << endl;
                                            fichier.clear();
                                            fichier.seekg(0, ios::beg);
                                            cout << endl << "On se trouve à nouveau au " << fichier.tellg() << "ieme octet." << endl;
                            
                                            cout << endl << "Cherchons la 4ieme ligne de notre fichier" << endl;
                                            for(size_t nbLignes=0; nbLignes<3 && fichier.ignore(numeric_limits<int>::max(), '\n'); ++nbLignes)
                                            {
                                                // Ne rien mettre ici.
                                                /* La boucle parcourt simplement le fichier tout en ignorant ce qu'elle y trouve (elle ne conserve rien en mémoire)
                                                et a la 4ieme ligne, elle s'arrete. */
                                            }
                                            if(getline(fichier,ligne))
                                                cout << "La 4ieme ligne de notre fichier est " << ligne << endl;
                                                /* La condition 'if' récupère la ligne où nous nous sommes arretes */
                            
                                            fichier.close();
                                    }
                                    else
                                            cerr << "Impossible d'ouvrir le fichier !" << endl;
                            
                                    return 0;
                            }
                            


                            Bon codage.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Aller a une ligne d'un fichier

                            × 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