Find_first_of("/"); probléme de recupura

Résolu
yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   -  
yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   -
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 <iostream>
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();
}

5 réponses

yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   13
 
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 :
[code]
#include <string>
#include <fstream>
#include <iostream>
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();
}
[/code]
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
C'est la cinquième fois que je te le dit, pourquoi utiliser find_first_of ???
L'intéret de cette fonction est de lui fournir plusieurs caractères et toi tu lui en fourni qu'un, alors autant utiliser find() !
Pour la cinquième fois encore : tu ne teste pas tes retour de find() pour vérifier qu'ils ont bien trouver quelque chose !
Ton souligne1 me parait étrange, ça ne serait pas plutôt substr(pos2,pos-pos2) ?
0
yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   13
 
oui je sais, mais ça le meme resultat find ou find_first_of ça ne change rien
0
yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   13
 
oui je sais, mais ça le meme resultat find ou find_first_of ça ne change rien
0

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

Posez votre question
yanlou Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   13
 
#include <string>
#include <fstream>
#include <iostream>
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();
}
0