Comparaison de substring

Signaler
Messages postés
9
Date d'inscription
lundi 25 janvier 2010
Statut
Membre
Dernière intervention
22 mars 2010
-
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
-
Bonjour,
Je cherche désespérément a trouver et compter la récurrence de tous les substring qui se répète dans une chaine de caractère variable. Je suis coincé, car je n'arrive pas à faire une comparaison entre les substring. J'ai mis en bleu la partie qui ne fonctionne pas, mais je ne sais pas comment la corriger. Est-ce que quelqu'un peut me donner une coup de pouce? Merci d'avance


#include <cmath>
#include <fstream>
#include 
#include <string>

using namespace std;



int main()
{
    int longueur_motif = 0, i=0, minimum_frequence = 0, maximum_motif = 0, resultat = 0, cpt=0;
    string contenu;
    string mon_fichier_seq, nom_fichier_resultat;
    const int LONGUEUR_MAX_SEQ = 3001;

        cout<<"Entree le nom du fichier qui contient la chaine de caracteres"<<endl;
        cin>>mon_fichier_seq;

        cout<<"Entree le nom du fichier dans lequel le resultats doivent etre ecrit"<<endl;
        cin>>nom_fichier_resultat;

        cout<<"Entree la longueur des motifs recherches"<<endl;
        cin>>longueur_motif;

       
        ifstream fichier(mon_fichier_seq.c_str(), ios::in);  // Ouverture du fichier en lecture
        if(fichier)  // si l'ouverture a réussi
        {

            while (i<contenu.length()-1)
                {
                getline(fichier,contenu);
                cout<< contenu.substr(i,longueur_motif)<<endl;
                i=i+longueur_motif;
                }

                for (i=0; i<contenu.length() ; i++ )
            {
                 found=str.find(contenu.substr(i,longueur_motif);
                found=contenu.find(getline(fichier,contenu));
                if (found !=string::npos)
                resultat=cpt++;
            }

                fichier.close();  // Fermeture du fichier
        }
        else  // sinon
                cerr << "Impossible d'ouvrir le fichier !" << endl;

        return 0;
}



10 réponses

Messages postés
9
Date d'inscription
lundi 25 janvier 2010
Statut
Membre
Dernière intervention
22 mars 2010

oups la couleur n'a pas fonctionné. Bref, c'est à partir du found = str.find.... qui ça se gâte... comme vous l'avez surement remarqué! Dois-je utiliser la fonction strcmp ou bien le find est meilleur?
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Peux-tu poster un code qui compile ? Que l'on puisse t'aider.


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Je ne sais pas ce que tu cherches à réaliser.
Pour lire un fichier ligne à ligne, tu peux faire ceci:
#include <fstream>
#include 

int main()
{
  int longueur_motif = 0;
  std::string mon_fichier_seq, nom_fichier_resultat;

  std::cout << "Entree le nom du fichier qui contient la chaine de caracteres" << std::endl;
  std::cin >> mon_fichier_seq;

  std::cout <<
    "Entree le nom du fichier dans lequel le resultats doivent etre ecrit" << std::endl;
  std::cin >> nom_fichier_resultat;

  std::cout << "Entree la longueur des motifs recherches" << std::endl;
  std::cin >> longueur_motif;


  std::ifstream file(mon_fichier_seq.c_str(), std::ios::in);
  if (!file)
  {
    std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;
    return 1;
  }

  while (file)
  {
    std::string line;
    std::getline(file, line);
    std::cout << line << std::endl;
  }
  file.close();

  return 0;
}


Il faut ensuite que tu sois plus précis sur ce que tu cherches à faire. N'hésite pas à donner des exemples.
Soit dit en passant, évite les "using namespace" (voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
9
Date d'inscription
lundi 25 janvier 2010
Statut
Membre
Dernière intervention
22 mars 2010

D'accord, je cherche à lire une fichier contenant une truc du genre:

CUGAGCTTCCGATUCCATTTCUGTATUACACAGACTGGACGGAAGCGACAATCTCACUTTTGTGTAACAACACACACGUTATCGGCACATATTCCGGUGGTGCCCTUTTGGGGTCGGTAATATGGGATAUCGTGGAGGCATAACCCUGGACTTCCGUTCCATTTCGTATACACAGACTGGAUCGGAAGCGACAATUCTCACTTTGTGTAUCAACACACACGTATCGGCACATATTCCGGGGTGCUCCTTTGGGGTCGGTUAATATGGGATACGTGGAGGCATAACC

Je veux que l'utilisateur puisse déterminer lui-même la longueur des substring. L'objectif est de trouver combien de fois les substring de longueur déterminé sont présents dans la chaînes. Cependant même si le premier caractère du substring est différent ça compte quand même. Par exemple,
GGA=2
UGA=5
UAA=4
TCA=2
etc..

ou dans un cas différent

AACC =3
AATT = 3
GCTT = 2
etc..
Biensur c'est fictif, parce que je n'ais pas pris le temps de compté le nombre de fois que GGA apparaît dans la chaine.

Merci encore!!
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Désolé, je n'ai toujours pas compris. Peux-tu faire un vrai exemple ?

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
C'est pourtant simple !! (a comprendre) Mais faut faire gaffe à l'algo de recherche.

On choisi une taille, 3 par ex.
On prend les 3 premiers caractères, puis on cherche combien de fois cette chaine de 3 caractères apparait dans tout le fichier.
Pour on passe à la suite, c'est a dire la chaine du 2e au 4e caractères, et on cherche combien de fois cette chaine de 3 caractères apparait.
Et ainsi de suite.
Attention à mémoriser les chaine déjà traitée.

Mais peut-être que je suis a côté de la plaque !
Messages postés
9
Date d'inscription
lundi 25 janvier 2010
Statut
Membre
Dernière intervention
22 mars 2010

Bon ok, si je dis la chaine suivante :
GTGGAATTGTGAGCGGATAACAATTTCACACAGGAAACAGCTATGA
CCGTGATTTTGGATTCAGAA

Je divise ma chaine en sous-séquence de 3 alors j'obtiens:
GTG GAA TTG TGA GCG GAT AAC AAT TTC ACA CAG GAA ACA GCT ATG ACC GTG ATT TTG GAT TCA GAA

J'ai 21 sous-séquence, je cherche combien de fois GTG est présent et dans se cas il revient une fois donc il y a 2 GTG dans la chaine. Ensuite je passe au suivant qui est GAA, et il revient 2 fois donc GAA faut 3, Ainsi de suite.

GTG = 1
GAA = 3
Messages postés
9
Date d'inscription
lundi 25 janvier 2010
Statut
Membre
Dernière intervention
22 mars 2010

En effet, c'est exactement comme fregolo52 a dit
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
c'est pas tout a fait ce que j'ai dit, toi tu avances de 3 en 3, moi ce que je disais, c'est de 1 en 1.
Donc dans :
GTGGAATTGTGAGCGGATAACAATTTCACACAGGAAACAGCTATGA
CCGTGATTTTGGATTCAGAA

je commence par chercher GTG puis TGG puis GGA ...
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Utilise ceci, ça devrait t'aider:
(si all == vrai, alors ça fait ce qu'a écrit fregolo (un en un), sinon ça recherche après chacune des occurences trouvées).

int search(const std::string& line, const std::string pattern, bool all)
{
  int start = 0;
  int nb = 0;
  std::string::size_type loc;
  const int step = all ? 1: line.size();
  while ((loc = line.find(pattern, start)) != std::string::npos)
  {
    ++nb;
    start = loc + step;
  }

  return nb;
}


A lancé comme suit:
std::cout << search(line, line.substring(i, longueur_motif), false) << std::endl;


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]