Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparer 2 lignes du meme dossier .txt

    9 décembre 2019 à 17:08:48

    Bonjour j'ai un fichier text dont le contenu est le suivant :

    IN v1 0 0 1 1 //v1 Sequence for outputs is identical

    IN v2 0 1 0 1 //v2 Sequence for outputs is identical

    STATE a TO a x b b OUT 0 x 0 1

    STATE b TO a b b b OUT 0 1 1 0 

    STATE c TO a b b b OUT 0 1 1 0 

    Et le programme doit sortir le tableau comme ça :

    IN v1 0 0 1 1 //v1 Sequence for outputs is identical

    IN v2 0 1 0 1 //v2 Sequence for outputs is identical

    STATE a TO a x b b OUT 0 x 0 1

    STATE bc TO a b b b OUT 0 1 1 0 

    C'est a dire je dois comparer que les 3 dernieres lignes (commençant apres "TO") si 2 lignes sont identiques je dois les fusionner.

    Ma question est comment comparer 2 lignes d'un meme fichier en general ?

    • Partager sur Facebook
    • Partager sur Twitter
      9 décembre 2019 à 17:14:16

      Bonjour,

      Tu peux utiliser un mix de std::getline(std::ifstream, std::string); et comparer les deux std::string avec l'opérateur d'égalité.

      if( std::ifstream inputFile{"textFile.txt"} )
      {
          std::vector<std::string> fileLines;
          std::string line;
          while( std::getline( inputFile, line )
          {
              fileLines.push_back(line);
      
          }
      }

      Après tu peux choisir les lignes à comparer avec l'opérateur crochets du std::vector ;)

      • Partager sur Facebook
      • Partager sur Twitter

      Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

        9 décembre 2019 à 17:49:23

        Warren79 a écrit:

        Bonjour,

        Tu peux utiliser un mix de std::getline(std::ifstream, std::string); et comparer les deux std::string avec l'opérateur d'égalité.

        if( std::ifstream inputFile{"textFile.txt"} )
        {
            std::vector<std::string> fileLines;
            std::string line;
            while( std::getline( inputFile, line )
            {
                fileLines.push_back(line);
        
            }
        }

        Après tu peux choisir les lignes à comparer avec l'opérateur crochets du std::vector ;)

        J'essaye tant bien que mal de comprendre ce que tu veux dire mais j'y arrive pas :( 

        C'est mon premier projet avec C++ du coup je suis entrain d'apprendre le langage en mm temps.

        J'ai compris que ton while loop parcours le fichier mais j'ai pas compris comment comparer.



        • Partager sur Facebook
        • Partager sur Twitter
          9 décembre 2019 à 18:01:28

          En fait std::getline renvoie 'true' si elle a pu lire au minimum un caractère et faux si l'opération a échoué, donc la ligne 'while( std::getline() )' lit toutes les lignes du fichier jusqu'à atteindre la fin de celui-ci. (Tu noteras au passage que std::getline() ne stocke pas les fin de lignes(*1) dans le deuxième paramètre qui est une std::string, soit un type du c++ qui stocke une chaine de caractère).

          Le type 'vector' est une classe template qui se charge d'allouer le nombre voulu du type fourni en template dans un tableau dynamique. Ici on veut pouvoir pourvoir stocker plusieurs std::string (des lignes de fichier ici) en mémoire. Le std::vector gère tout seul comme un grand la taille du tableau dynamique, il permet notamment de:

          - Rajouter un élément à la fin du tableau avec les fonctions membres 'push_back' et 'emplace_back'

          - Initialiser le tableau dynamique à la taille voulue (dans les limites de la taille de la mémoire) avec le constructeur.

          - Accéder à la case voulue avec les crochets (l'opérateur crochet) : fileLines[ 'numéro case' ]

          Ici comme tu peux le voir je rajoute dans le while une ligne de fichier lue au bout du tableau.

          Une fois toutes les lignes lues tu peux les afficher avec le code suivant:

          for( auto const &line : vect )
          {
             std::cout << line << std::endl;
          }
          
          ou bien :
          
          if( false == vect.empty() )
          {
             for( size_t i{0} ; i < vect.size() ; ++i )
             {
                 std::cout << vect[i] << std::endl;
             }
          }

          Préfère la première solution à chaque fois que c'est possible ;)

          Admettons que tu as 10 lignes dans ton vector , pour (par exemple comparer la ligne 7 à la ligne 9), il te suffit d'écrire ceci:

          std::vector <std::string> vector;
          
          //Ici: code pour lire les lignes du fichier
          
          //----------------------------------------
          if( vector[6] == vector[8] )
          {
              // si les lignes sont identiques
          }
          else{
             // si les lignes sont différentes
          }



          -
          Edité par Warren79 9 décembre 2019 à 18:06:40

          • Partager sur Facebook
          • Partager sur Twitter

          Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

            9 décembre 2019 à 19:44:33

            Warren79 a écrit:

            En fait std::getline renvoie 'true' si elle a pu lire au minimum un caractère et faux si l'opération a échoué, donc la ligne 'while( std::getline() )' lit toutes les lignes du fichier jusqu'à atteindre la fin de celui-ci. (Tu noteras au passage que std::getline() ne stocke pas les fin de lignes(*1) dans le deuxième paramètre qui est une std::string, soit un type du c++ qui stocke une chaine de caractère).

            Le type 'vector' est une classe template qui se charge d'allouer le nombre voulu du type fourni en template dans un tableau dynamique. Ici on veut pouvoir pourvoir stocker plusieurs std::string (des lignes de fichier ici) en mémoire. Le std::vector gère tout seul comme un grand la taille du tableau dynamique, il permet notamment de:

            - Rajouter un élément à la fin du tableau avec les fonctions membres 'push_back' et 'emplace_back'

            - Initialiser le tableau dynamique à la taille voulue (dans les limites de la taille de la mémoire) avec le constructeur.

            - Accéder à la case voulue avec les crochets (l'opérateur crochet) : fileLines[ 'numéro case' ]

            Ici comme tu peux le voir je rajoute dans le while une ligne de fichier lue au bout du tableau.

            Une fois toutes les lignes lues tu peux les afficher avec le code suivant:

            for( auto const &line : vect )
            {
               std::cout << line << std::endl;
            }
            
            ou bien :
            
            if( false == vect.empty() )
            {
               for( size_t i{0} ; i < vect.size() ; ++i )
               {
                   std::cout << vect[i] << std::endl;
               }
            }

            Préfère la première solution à chaque fois que c'est possible ;)

            Admettons que tu as 10 lignes dans ton vector , pour (par exemple comparer la ligne 7 à la ligne 9), il te suffit d'écrire ceci:

            std::vector <std::string> vector;
            
            //Ici: code pour lire les lignes du fichier
            
            //----------------------------------------
            if( vector[6] == vector[8] )
            {
                // si les lignes sont identiques
            }
            else{
               // si les lignes sont différentes
            }



            -
            Edité par Warren79 il y a environ 1 heure


            Mercii beaucoup je vais m'y remettre et essayer tout ça :D
            • Partager sur Facebook
            • Partager sur Twitter

            Comparer 2 lignes du meme dossier .txt

            × 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