Partage
  • Partager sur Facebook
  • Partager sur Twitter

fichier.txt et récupération de données

Sujet résolu
    21 septembre 2008 à 21:47:25

    Hello,

    J'ai écrit le ptit script suivant pour ouvrir un fichier.txt et lire les données qui s'y trouvent.
    Tout ce passe bien, le fichier s'ouvre et l'ensemble du contenu s'affiche: 4 colonnes (variables) et 23 lignes de données (1ere ligne= nom de mes variables et le reste des lignes= nombre entiers). A partir de là, j'ai besoin de vous... Je ne sais pas comment récupérer chaque valeur de chacune de mes variables pour chaque ligne, afin de les réutiliser par la suite... Extraction dans un tableau? dans un vecteur? Je suis perdue et je ne comprends pas comment coder la suite.
    Quelqu'un peut m'aider?
    merci beaucoup :) ...



    Ptit script ok jusque là:


    #include <iostream>
    #include <string>
    #include <fstream>
    #include <iomanip>

    int main()
    {
    std::ifstream fichier("H:\CS3P.txt", std::ios::in|std::ios::binary ); // le constructeur de ifstream permet d'ouvrir un fichier en lecture

    if ( !fichier ) // test pour savoir si fichier ouvert
    {
    std::cout<<"Ouverture impossible!\n";
    exit(-1);
    }
    else
    {
    std::cout<<"Ok, fichier ouvert\n";
    std::string ligne; // variable contenant chaque ligne lue
    while (std::getline(fichier, ligne))// cette boucle s'arrête si erreur lecture
    {
    std::cout <<ligne << std::endl;// affiche la ligne
    }
    }


    return 0;
    }

    PS: je code sur Visual C++ 2005 Express Edition
    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2008 à 21:52:12

      (utilise les balises < code></code > c'est mieux !)

      Pour ton problème, soit tu passe par une RegExp, soit tu as un format spéciale de fichier, par exemple, le nombre de variable dans la première ligne, puis dans chaque ligne le nom de la variable est de la ligne 0 à 10, et la valeur de 12 à la fin.

      Tu met tous ça dans un tableau à 2 dimensions et c'est bon !
      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2008 à 22:51:49

        salut!
        tu dis que, mis à part la 1ère ligne, tu a à chaque fois 4 colonnes, donc on a un fichier de ce style si j'ai bien compris:
        A B C D
        1 1 1 1
        2 2 2 2
        3 3 3 3

        donc tu commences par enlever la 1ère ligne:
        fichier >> ligne;
        

        puis tu as 23 lignes: tu peux les sauvegarder dans une liste avec une structure comportant 4 éléments (je pars sur le principe que ce sont des 'int', passons les templates)
        struct monElement
        {
        monElement(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) {}
        int a, b, c, d;
        };
        
        // liste d'éléments 
        #include <list>
        
        int main()
        {
        // ..... tout ce que tu as fait avant le stockage
         std::list<monElement> maListeDElements;
          for (int i = 0; i < 23 && !fichier.eof(); ++i) // on verifie qu'on ne va pas recupérer sur un fichier que l'on a terminé de parser
         {
           int a, b, c, d;
           fichier >> a >> b >> c >> d; // le ifstream s'occupe de sauter les espaces/tab/etc
           maListeDElements.push_back(monElement(a,b,c,d));
         }
        }
        

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2008 à 2:46:17

          @mixav, les conditions de ta boucle ne sont pas bonnes (on ne teste jamais sur eof), et on évite de préfixer par des tirets-bas. Dans les deux cas, cf la FAQ C++ de développez.
          +1 pour les std::vector

          @nul++, le début est bon, après, il faut que tu transformes ta ligne en stream avec un std::istringstream.
          N'ouvre pas un fichier texte en binaire
          Et exit n'est pas notre ami en C++.
          • 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.
            24 septembre 2008 à 7:02:36

            Merci à vous trois pour vos réponses rapides!

            Par contre, à l'affichage de chacune des valeurs de mes variables (a, b, c, d, qui doivent être entiers positifs > 0), j'obtiens le même nombre : -858993460 :( ... J'essaie d'éclaicir ça en attendant vos lumières :) ...


            Pour comprendre (je pars bien de zéro ;) ):
            -pourquoi ne pas tester sur EOF (controle de fin de fichier?)? Mieux de le mettre dans un "While ()" ou pareil...?
            -pourquoi faut-il éviter "exit()" et les préfixes en tiret-bas?

            -"Transformer ma ligne en stream avec std ::istringstream " : concrètement est-ce que ça revient à appliquer le code suivant?...en l'appliquant à mon cas j'arrive aux mêmes résultats qu'avec la version du code de mixav...

            Citation : Transfo ligne en stream...


            #include <sstream>

            int main()
            {
            // créer un flux à partir de la chaîne à convertir
            std::istringstream iss( "10" );
            // convertir en un int
            int nombre;
            iss >> nombre; // nombre vaut 10
            }



            Merci d'avance pour la suite :) !
            • Partager sur Facebook
            • Partager sur Twitter
              24 septembre 2008 à 9:22:08

              1) Réponse détaillée dans la FAQ de developpez.net. Une lecture correcte se fait comme suit:
              while(getline(flux,string))
              {
              
              }
              


              Un exemple complet dans les exercices (post-it du forum).

              2)exit() est moche car il coupe brutalement le programme sans libérer la mémoire et autres choses de ce genre. On utilise exit() que si la suite du programme aurait des conséquences graves (destruction de données, mort d'un composant électronique,...).

              3)Les préfixes avec des _ au début sont réservés à la bibliothèque standard. Si tu les utilises, tu risques d'avoir des conflits si tu as une variable qui a le même nom que une variable de la biblio standard.

              4) Oui c'est correct ton istringstream

              P.S.: utilise les balises <code> et pas <citation> sur le forum pour les codes.



              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                30 septembre 2008 à 20:32:16


                Merci, ça marche! Je récupère bien mes valeurs, elles sont bien convertis en "int" donc je peux les réutiliser ensuite pour les calculs...J'ai laissé "exit(1)" parceque je ne sais pas comment faire stopper le programme autrement pour l'instant. Le programme doit s'arreter à une valeur de "u" donnée...Autre proposition que "exit(1)"...?

                Soucis suivant:
                J'ai remis une tartine de code en-dessous (dslé il est infame à lire, je ne dois pas bien employer les balises
                parceque ça ne l'affiche pas comme attendu...oui oui, le boulet... ms j'ai l'impression d'avoir tout cliqué comme indiqué pourtant?!). Enfin, le problème que j'ai maintenant, c'est que la boucle "for" qui est contenu dans la boucle "while" (ça c'est ptêtre pas juste d'ailleurs!) ne s'execute que pour la première ligne de mon tableau txt...POURQUOI   :colere:  !!! Elle est surement pas bien positionnée car quand je la mets "//off", les instructions s'exécutent normalement sur toutes les lignes de mon tableau... 
                
                Voilà, j'y retourne et merci d'avance!
                
                Mon code (...qui veut pas s'afficher comme je veux  :colere:  !):
                
                <code type="cpp">
                #include <iostream>
                #include <fstream>
                #include <iomanip>
                #include <string>
                #include <sstream>
                
                
                int K=3; 
                int I1=1; 
                int I2=2; 
                int I3=3;
                
                int t;
                int n;
                int i;
                int x;
                
                int main()
                {
                std::ifstream fichier("H:\EssaieproG.txt", std::ios::in);
                        
                        if (fichier) //ce test échoue si le fichier n'est pas ouvert
                        {        
                        std::cout<<"Fichier Ouvert!\n";
                        
                        std::string ligne;
                
                while (getline(fichier, ligne))  
                {
                                        std::string station; 
                                        std::string passage11;
                                        std::string passage22;
                                        std::string passage33;
                
                fichier>> station >> passage11 >> passage22 >> passage33;
                
                                        // créer un flux à partir de la chaîne à convertir
                                        std::istringstream iss1(passage11);
                                        // convertir en un int                        
                                        int passage1;
                                        iss1 >> passage1; 
                
                                        std::istringstream iss2(passage22);
                                        int passage2;                        
                                        iss2 >> passage2; 
                
                                        std::istringstream iss3(passage33);
                                        int passage3;
                                        iss3 >> passage3; 
                
                std::cout<<"passage1=" << passage1 <<"\n" << "passage2="<< passage2 <<"\n" << "passage3="<< passage3 <<"\n";
                                        
                t= passage1 + passage2 + passage3;
                std::cout<< "Effectif_tot="<< t <<"\n";
                
                x= ((K-I1)* passage1)+((K-I2)* passage2)+((K-I3)* passage3);
                std::cout<<"x="<<x <<"\n";
                
                
                
                for (n=t; n<=10000; n++) 
                                        {
                
                                        float u=1.00;
                
                                                for (i=1;i<=K;i++) 
                                                {
                                                u=u*((K*n)-x-t+1+(K-i))/((K*n)-x+2+(K-i)); 
                                                }
                
                                                u=(n+1)*u/(n-t+1);
                                                
                if(u<1)
                                        {
                        std::cout<<"U<1 pour une valeur de N égale à:"<< n <<"\n"<<std::endl;
                        exit(1);
                                                        
                                        }
                                        }
                                        
                                        }
                        }
                        else
                        {
                        std::cout<<"Ouverture impossible!\n";
                        }
                        
                        return 0;
                }
                • Partager sur Facebook
                • Partager sur Twitter

                fichier.txt et récupération de données

                × 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