Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lectures de données dans un fichier

Sujet résolu
    18 juin 2007 à 12:40:03

    Bojour à tous :)

    je souhaite récupérer des données dans un fichier à une ligne précise (c'est une heure que je veux récupérer, mais peu importe)

    Le fichier est structuré comme ça:

    xxxxx
    xxxx
    xxxxx
    xxxx
    xxxx
    xxxx
    xxxx
    xxxx
    xxx   "heure a récuperer"
    xxxxxx
    xxxxx xxxx xxxxx "heure 2 à récuperer"


    Mais je ne trouve pas le moyen de lire le fichier et d'aller directement à une ligne bien définie... J'ai essayé GetLine mais ça ne marche pas :(

    Voila, j'ai cherché toute la matinée sans résultats donc j'en appele à vous! merci d'avance ;)

    EDIT: On a reussi a lire ce qu'on voulait :)

    Par contre,on veut faire une difference entre deux temps (format hh:mm:ss) après les avoir préalablement converti en seconde. On utilise Difftime mais ça ne marche pas car les 2 temps sont lus dans un fichier et pour le programme ce n'est que du texte. Il faudrait une fonction pour lui dire que ce sont 2 temps. On a utiliser time_t mais il ne lit que l'heure hh et oublit le reste.


    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2007 à 13:09:45

      Les xxxxx, c'est quoi ?
      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2007 à 13:36:04

        Les xxxx c'est des données (texte et valeur chiffrées) sans importance ;)
        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2007 à 13:47:28

          Et la ligne qui contient l'heure, elle a un truc de spécial ?
          Comme un caractère spécial en debut de ligne, ou autre
          Ou alors tu connais le numero de la ligne qui contient l'heure ?
          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2007 à 14:07:36

            Je connais juste la ligne qui contient l'heure, elle a rien d'autre de particulier
            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2007 à 14:20:39

              Y a-t'il toujours 3 caractères puis 3 espaces avant le premier guillemet?
              • Partager sur Facebook
              • Partager sur Twitter
                18 juin 2007 à 16:58:22

                Si tu connais le numero de la ligne, tu lis chaque ligne de ton fichier avec fgets jusqu'à tomber sur la bonne ligne.
                A ce moment, tu extrais ton heure avec fscanf
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juin 2007 à 17:57:29

                  Tu compte les \n jusqu'à arriver à la bonne ligne, ou tu met un # par exemple au début de ta ligne et tu va jusqu'au # avec une boucle.
                  Il y plein de méthodes, tu fait comme tu veux
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juin 2007 à 1:24:49

                    Ignore tes n lignes avec un std::istream::ignore, puis lis celle qui t'intéresse avec un std::getline()
                    for (int i=0
                        ; i !=N-1 && f.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
                        ; ++i)
                    {}
                    std::string line;
                    if (std::getline(f, line))
                        doSomethingWithTheNthLine(line);
                    • 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.
                      19 juin 2007 à 9:37:52

                      Merci pour vos réponses :)

                      Effectivement, on peut pas arriver directement a la ligne en question donc on va faire avec un get line bouclé :)

                      Saphir: oui c'est normalement toujours la meme strucuture des données dans le fichier, c'est pour cela qu'on sougaitait arriver directement a une ligne donnée ;)

                      Par contre Dgil, ça c'est pas possible, les fichiers sont générés par une machine qui les fera toujours pareil mais pas forcément de la façon que l'on veut, donc on peut pas inserer de caractère particulier.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 juin 2007 à 9:50:57

                        Si tu n'as pas besoin du contenu de la ligne, un ignore sera mieux qu'un getilne.
                        • 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.
                          19 juin 2007 à 14:48:08

                          On a reussi a lire ce qu'on voulait :)

                          Par contre,on veut faire une difference entre deux temps (format hh:mm:ss) après les avoir préalablement converti en seconde. On utilise Difftime mais ça ne marche pas car les 2 temps sont lus dans un fichier et pour le programme ce n'est que du texte. Il faudrait une fonction pour lui dire que ce sont 2 temps. On a utiliser time_t mais il ne lit que l'heure hh et oublit le reste.

                          Merci d'avance.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            19 juin 2007 à 18:00:18

                            Il faut tokenizer la string pour en extraire les donnée que tu veux.
                            Voici une fonction qui le fait :

                            void Tokenize(const string& str,
                                                  vector<string>& tokens,
                                                  const string& delimiters = " ")
                            {
                                // Skip delimiters at beginning.
                                string::size_type lastPos = str.find_first_not_of(delimiters, 0);
                                // Find first "non-delimiter".
                                string::size_type pos     = str.find_first_of(delimiters, lastPos);

                                while (string::npos != pos || string::npos != lastPos)
                                {
                                    // Found a token, add it to the vector.
                                    tokens.push_back(str.substr(lastPos, pos - lastPos));
                                    // Skip delimiters.  Note the "not_of"
                                    lastPos = str.find_first_not_of(delimiters, pos);
                                    // Find next "non-delimiter"
                                    pos = str.find_first_of(delimiters, lastPos);
                                }
                            }


                            Si tu comprend pas dit le.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 juin 2007 à 22:49:45

                              Sur les *nix (POSIX?) il y a strptime qui simplifie grandement la vie.
                              • 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.
                              Anonyme
                                20 juin 2007 à 10:47:22

                                Merci lmghs.
                                Connaissait pas.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 juin 2007 à 15:47:00

                                  Merci a tous pour vos réponse, malheureusement on arrive a rien :(

                                  ce qu'il nous faudrait c'est stprtime, mais on arrive pas a le faire marcher (apparament notre compilateur le connait pas, ou on a pas la bonne syntxe du tout :D ), et pour ce qui est de tokeniser le compilateur ne semble pas connaitre non plus (le bout de code dispos ici ne marche pas)

                                  Mais il nous reste une solution: prendre chaque composante de l'heure et la multiplier par ce qu'il faut pour tout convertir en secondes.
                                  Voila comment on compte faire:
                                  L'heure est formatée comme suit: HH:MM:SS
                                  donc on va faire HH*3600+MM*60+SS et ça donnera le bon truc
                                  malheuresement on arrive pas a scanner la ligne: si on a l'heure suivante: 15:45:32, un
                                  fichier >> heure >> minute >> seconde >> endl;
                                  revois bien l'heure mais ni la minute ni les secondes :(
                                  J'en appelle donc a vous pour savoir ce qu'il manque a notre démarche, ça doit pas etre grand chose je pense ;)

                                  En tout cas vraiment merci pour vos réponses, meme si elles ne marchent pas elles étaient toutes très justes et pertinantes :)

                                  EDIT: ce code marche si je remplace les ":" dans l'heure par des espaces, il faut donc juste que je lui fasse comprendre que ":" est un séparateur :) mais j'y arrive pas :(

                                  EDIT2: c'est bon on a trouvé :D:D
                                  en fait la syntaxe etait fichier >> heure >> ':' >> minute etc, alors qu'on mettait en general fichier >> heure >> ":" >> minute :p probleme résolu! :lol:
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Lectures de données dans 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