Find_first_of("/"); probléme de recupuration d'une chaine de caractére dans une

Résolu
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010 - 10 juil. 2008 à 11:25
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010 - 10 juil. 2008 à 15:19
salut, svp si quelqu'un peux m'aidé, pour récupuré une chaine de caracté dans une ligne, le probléme c'est qu'il ya des critére

exemple de la chaine de caractére du fichier d'entré:

FT;4249;D;RFRPAD8/A8;2063à2093
   
je fais le test sur le caractére "/" je donne la position du debut de la chaine mais mon programme ne trouve pa le slach si je mit :

std::string sousligne1=ligne.substr(pos2+1,pos);
resultat que j'obtient aprés execution:
RFRPAD8/A8;2063à2093   
RFRPAD8/A8;2063à2093   

sinon pour qu'il reconnais le "/" je doit donné la position depui le debut de la ligne :

std::string sousligne1=ligne.substr(0,pos);
resultat  que j'obtient aprés execution:

FT;4249;D;RFRPAD8
A8;2063à2093   

le resultat que je veux obtenir dans le fichier de sortie:

RFRPAD8
RFRPAA8

voici le code :

#include <string>
#include <fstream>
#include
using namespace std;
void main()
{
    ifstream fichier("proto.txt");
  ofstream h("test.txt");


    if (fichier)
    {


  std::string ligne;


       
        while (getline(fichier,ligne))
        {




   // Récupération 1er champ et écriture dans le fichier
            size_t pos0=ligne.find_first_of(";");
   //h << ligne.substr(0,pos0) << " " << endl;


            //Récupération 2e champ et écriture dans le fichier
            size_t pos1=ligne.find_first_of(";",pos0+1);
            //h << ligne.substr(pos0+1,pos1-pos0-1) <<std::endl;


   // Récupération 3e champ et écriture dans le fichier
   size_t pos2=ligne.find_first_of(";",pos1+1);
            //h << ligne.substr(pos1+1,pos2-pos1-1) <<std::endl;


   // Récupération 4e champ et écriture dans le fichier
   size_t pos3=ligne.find_first_of(";",pos2+1);
            //h << ligne.substr(pos2+1,pos3-pos2-1) << std::endl;


   // Récupération 5e champ et écriture dans le fichier
   size_t pos4=ligne.find_first_of(";",pos3+1);
            //h << ligne.substr(pos3+1,pos3-pos2-1) <<std::endl;




   size_t pos=ligne.find_first_of("/");


   std::string sousligne1=ligne.substr(pos2+1,pos);
     
   std::string sousligne2=ligne.substr(pos+1);


   std::string sousligne3=sousligne1.substr(0,sousligne1.size()-2).append(sousligne2);
  
    
    if (sousligne1.compare(sousligne2))
    {
     h<<"CDFX1"<< sousligne1 << "\n" <<"CDFX2"<< sousligne3 << std::endl;
    }
    else
    {
     h <<"CDFX"<< ligne.substr(pos2+1,pos3-pos2-1) << std::endl;
    }
  }
 }


    fichier.close();
 h.close();
}




maximus

8 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
10 juil. 2008 à 13:36
Salut,
Dans la 1ère partie de ton code, tu recherches les occurrences du slash, ce qui implique que tu déplaces le curseur sur la chaine. Ensuite, tu recherche l'occurrence du point-virgule. Or, ton curseur s'étant déplacé, la fonction ne le trouvera pas...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
10 juil. 2008 à 14:27
mouais...
Au lieu de recherche du début vers la fin, tu le fais dans l'autre sens....
ça ne fait que reporter le problème...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
10 juil. 2008 à 15:12
Mais je sais pas moi, tu change tout le temps le fonctionnement
Je t'explique le principe de l'objet string et de la fonction find_first_of():

En gros, il faut voir l'objet string comme une encapsulation d'un tableau de caractères et d'un curseur. Quand tu fais appel à la fonction find_first_of (qui veut dire "recherche de la 1ère occurence"), tu déplaces un curseur le long du tableau, jusqu'à trouver le caractère (ou la sous-chaine) recherché(e). En schématisant, l'algo de cette fonction est le suivant:

- (par défaut, le curseur est au début du tableau)
- tant que caractère pointé par curseur différente du caractère recherché et qu'on a pas tout parcouru
  - avancer le curseur d'une case
- on retourne la position courante du curseur (que l'on a appelée "pos" dans le code)

Tu vois le principe? Tu remarqueras que la position du curseur n'a pas été ré-initialisé. Du coup, lors du prochain appel, la recherche démarrera à la position courante du curseur.

Maintenant un exemple concret.
Imagines que dans ta string, tu aies "RFRPAD8/A8;2063à2093".
Tu appelles la fonction find_first_of(";").
D'après ce que je t'ai raconté, en sortie de fonction, ton curseur pointera sur la 11e case du tableau.
Maintenant, si tu appelle la fonction find_first_of("/"), le curseur étant à la position 11, la fonction ne trouvera pas le caractère souhaité; Elle te retournera donc la position de la fin du tableau.

Est-ce que tu as compris mon explication? Est-ce que tu y voies un peu plus clair?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010
10 juil. 2008 à 12:05
bein voila j'ai esséyé de modifier le code mais j'obtien tjr ce resultat  

sousligne1 : RFRPAD8
sousligne2 : A8;2063à2093
souligne3 : RFRPAA8

le resultat que je désir :

sousligne1 : RFRPAD8
sousligne2 : A8
souligne3 : RFRPAA8

j'ai esséyé de prendr la pos avec les ";"
ça marché pour la sousligne1 et la sousligne3, mais pour la sousligne2 ça marche pas et je vois pa ou est l'erreur  !!

voici le code :

#include <string>
#include <fstream>
#include
using namespace std;
void main()
{
    ifstream fichier("proto.txt");
  ofstream h("test.txt");


    if (fichier)
    {


  std::string ligne;


       
        while (getline(fichier,ligne))
        {




   // Récupération 1er champ et écriture dans le fichier
            size_t pos0=ligne.find_first_of(";");
   //h << ligne.substr(0,pos0) << " " << endl;


            //Récupération 2e champ et écriture dans le fichier
            size_t pos1=ligne.find_first_of(";",pos0+1);
            //h << ligne.substr(pos0+1,pos1-pos0-1) <<std::endl;


   // Récupération 3e champ et écriture dans le fichier
   size_t pos2=ligne.find_first_of(";",pos1+1);
            //h << ligne.substr(pos1+1,pos2-pos1-1) <<std::endl;


   // Récupération 4e champ et écriture dans le fichier
   size_t pos3=ligne.find_first_of(";",pos2+1);
            //h << ligne.substr(pos2+1,pos3-pos2-1) << std::endl;


   // Récupération 5e champ et écriture dans le fichier
   size_t pos4=ligne.find_first_of(";",pos3+1);
            //h << ligne.substr(pos3+1,pos3-pos2-1) <<std::endl;




   size_t pos=ligne.find_first_of("/");


   std::string sousligne1=ligne.substr(0,pos);
     
   std::string sousligne2=ligne.substr(pos+1);


   std::string sousligne3=sousligne1.substr(0,sousligne1.size()-2).append(sousligne2);
  
    
    if (sousligne1.substr(pos2+1,pos3-pos2-1).compare(sousligne2.substr(0,pos0)))
    {
     h<<"sousligne1 : "<< sousligne1.substr(pos2+1,pos3-pos2-1) <<"\n"<<"sousligne2 : "<< sousligne2.substr(0,pos0)<< "\n" <<"souligne3 : "<< sousligne3.substr(pos2+1,pos3-pos2-4) << std::endl;
    }
    else
    {
     h <<"CDFX : "<< ligne.substr(pos2+1,pos3-pos2-1) << std::endl;
    }
  }
 }


    fichier.close();
 h.close();
}






maximus
0

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

Posez votre question
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010
10 juil. 2008 à 13:54
salut,
je ne comprend pas !! comment ça  le curseur s'étant déplacé, la fonction ne le trouvera pas
N.B: je suis debutant en c++

maximus
0
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010
10 juil. 2008 à 14:14
ça y é, c résolu
solution

#include <string>
#include <fstream>
#include
using namespace std;
int main()
{
    std::ofstream h("test.txt");
    std::ifstream fichier( "proto.txt" );




 if ( fichier )
    {
  h<<"DCP"<<";"<<"OPC"<<";"<<"CIC"<<";"<<"Way"<<";"<<"Trunk"<<";"<<"Switch"<<std::endl;
        std::string ligne;


        while ( std::getline( fichier, ligne ) )


       
    {
 // Recherche de '/'
 size_t posSlash = ligne.find("/");
 
 // Recherche du dernier ';' avant le '/'
 size_t posDot = ligne.rfind(";", posSlash);
 
 // Recherche du premier ';' apres le '/'
 size_t posDot_2 = ligne.find(";", posSlash);
 
 // Extraction de la sous chaine
 std::string sousligne1 = ligne.substr(posDot+1, posSlash - posDot-1);
 std::string sousligne2 =
     ligne.substr(posSlash+1, posDot_2 - posSlash-1);
 
 h << sousligne1 << endl << sousligne2 << std::endl;
 
    }
 
 
    return 0;
 }


 fichier.close();
}




maximus
0
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010
10 juil. 2008 à 14:42
et je dois fair comment !! j'ai esséyé mais c'est tous ce que j'ai pu fair

maximus
0
yanlou Messages postés 119 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 11 août 2010
10 juil. 2008 à 15:19
oui c clair mnt
maximus
0
Rejoignez-nous