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

Résolu
yanlou Messages postés 119 Statut Membre -  
yanlou Messages postés 119 Statut Membre -
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

  1. yanlou Messages postés 119 Statut Membre 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
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  3. yanlou Messages postés 119 Statut Membre 13
     
    oui je sais, mais ça le meme resultat find ou find_first_of ça ne change rien
    0
  4. yanlou Messages postés 119 Statut Membre 13
     
    oui je sais, mais ça le meme resultat find ou find_first_of ça ne change rien
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yanlou Messages postés 119 Statut Membre 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