Comparaison de substring

gazelle100 Messages postés 9 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 22 mars 2010 - 22 mars 2010 à 04:25
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 - 22 mars 2010 à 16:50
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

gazelle100 Messages postés 9 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 22 mars 2010
22 mars 2010 à 04:28
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?
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
22 mars 2010 à 12:51
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]
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
22 mars 2010 à 13:06
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]
0
gazelle100 Messages postés 9 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 22 mars 2010
22 mars 2010 à 13:46
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!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
22 mars 2010 à 13:56
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]
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
22 mars 2010 à 14:14
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 !
0
gazelle100 Messages postés 9 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 22 mars 2010
22 mars 2010 à 14:16
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
0
gazelle100 Messages postés 9 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 22 mars 2010
22 mars 2010 à 14:20
En effet, c'est exactement comme fregolo52 a dit
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
22 mars 2010 à 15:34
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 ...
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
22 mars 2010 à 16:50
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]
0
Rejoignez-nous