Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparer des lignes d'un fichier .txt

Sujet résolu
    8 janvier 2020 à 15:26:03

    Je souhaite comparer 2 lignes d'un fichier .txt et effacer l'une d'elles, si 2 sont identiques.

    Voici mon fichier text :

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

    Voici ce que je souhaite avoir comme sortie :

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

    J'ai commencé à comparer la première ligne avec le reste et j'ai une erreur à la fin de la comparaison (quand i=3) et une erreur en essayant d'effacer la ligne avec v.erase.

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <sstream>
    #include <string>
    
    int main()
    {
        std::vector<std::vector<std::string>> v;
        std::ifstream in("Hajer.txt");
        std::string record;
        bool match;
        int sum_true_1 =0;
        int matching_Line1 =100,j,i;
    
        while (std::getline(in, record))
        {
            std::istringstream is(record);
            std::vector<std::string> row((std::istream_iterator<std::string>(is)), std::istream_iterator<std::string>());
            v.push_back(row);
        }
    
        for (i = 0; i < v.size(); i++)
        {
            sum_true_1 = 0;
            for (j = 0; j < v[i].size(); j++)
            {            
                match = false;
                if (v[0][j] == v[i+1][j]) 
                {               
                    sum_true_1 += 1;
                }              
            }
            if (sum_true_1 == 12)
            {
                matching_Line1 = i;
                match = true;
                std::cout << "line 0 match to " << i << "   " << match << std::endl;
            }
        }
    
        for (const auto& row : v)
        {
            for (std::string x : row)
            {
                std::cout << x << ' ';  
                if(matching_Line ==0)
                {
                   v.erase(v.begin(),v.begin() +12);
                }
                std::cout << std::endl;
            }
    
        }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      8 janvier 2020 à 17:09:24

      Salut,

      Je pense que le conteneur std::map te sera utile:
      https://fr.cppreference.com/w/cpp/container/map

      • Partager sur Facebook
      • Partager sur Twitter
        9 janvier 2020 à 1:23:29

        salut...

        pour i==3 ,tu accèdes à un index dans le vector qui n'existe pas :v[3+1].

        quant à l'algo qui efface booof.

        et déclares tes variables où t'es prêt à les utiliser puis si possible initialises les.

        toujours privilégier la standard library

        -
        Edité par NapoléonMbaya 9 janvier 2020 à 1:29:47

        • Partager sur Facebook
        • Partager sur Twitter
          9 janvier 2020 à 11:14:00

          Inutile de comparer:

          Le conteneur std::map n'accepte les insertions que si la clef est unique.
          Donc insert tes ligne dedans, avec la ligne en guise de clef et de valeur, si l'insertion échoue, c'est que c'est un doublon (donc on jette).
          Au final, tu obtiendras des lignes uniques.

          PS:
          Ne pré déclares pas tes variables, cela nuit à leurs portée, leurs durée de vie, et à la lisibilité.

          • Partager sur Facebook
          • Partager sur Twitter

          Comparer des lignes d'un fichier .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