IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Remplacer des carractères dans une chaine


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut Remplacer des carractères dans une chaine
    Bonjour à toutes et à tous ,
    Je dois réaliser un logiciel en C++ avec mes quelques connaissances en C. Cela fait deux mois que je travail dessus et ça à pas mal avancé mais là je coince.
    Je voudrais lire le contenu d'un fichier entre deux balise. Puis enregistrer le tout dans un buffer de ma class et enfin, et c'est là de ça ce corse, je voudrais remplacer des Tags par des valeurs de tous types (chaine de carac, ou integer ...) . Voyez plutot :

    --==AVANT==--

    [BALISE]
    Blablablablablabla
    blablablabla
    %tag1 blablablabla %tag2 blablabla
    blablabla %tag3 blablabla
    ...
    [FIN_BALISE]

    --==APRES==--

    Blablablablablabla
    blablablabla
    coucou blablablabla 4400 blablabla
    blablabla Super si ça marche blablabla

    Et ce résultat doit ce trouver dans un second buffer pour après etre coller dans un nouveau fichier.( Mais ça je pense y arriver !! )

    Voila j'espère que je suis assez clair sinon n'hésitez pas à me le faire savoir merci d'avance !!!!

    Salut

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Est-ce que la valeur de chaque tag est toujours identique (%TAG1 est-il toujours égal à "Coucou" ?) ?
    Si oui, je pense qu'il te suffit de faire un descripteur qui parcourt ton fichier (ou ton 1er buffer). Il met toutes les valeurs qui ne sont pas intéressantes dans le 2e buffer tel quel, mais remplace certaines valeurs (les tags) par des valeurs.

    Est-ce bien ca que tu veux faire ? Si oui, où rencontre-tu des difficultés ?

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Oui et Non !!
    cad les valeurs devant remplacer ces Tags sont des arguments entrés au début du prog ( pour faire simple ). elle sont donc différentes à chaque fois de l'on relance l'appli....
    Donc si j'ai bien sasie ta question, oui les valeurs sont figées.
    Maitenant je vois bien le principe de ce qu'il faut faire : un décripteur qui ce promene ligne par ligne dans mon buffer mais ce que je ne vois pas bien c'est comment lui faire repérer le Tags ( sachant que les noms des Tags ne font pas tous la même taille ) et lui faire remplacer celui-ci par une valeur !!
    Le principe je l'ai j'ai même des organigrammes mon pb c'est plus au niveau prog je ne vois pas comment écrire ça ??

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Bonjour,

    j'avais implémenté la fonciton suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::string Replace(const std::string str, const std::string sb, const std::string sa)
    {
    	std::string::size_type n, nb = 0;
    	std::string strRet = str;
     
    	while ((n = str.find(sb,nb)) != std::string::npos)
    	{
    		strRet.replace(n,sb.size(),sa);
    		nb = n + sa.size();
    	}
     
    	return strRet;
    }
    Qui s'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using namespace std;
     
    int main(int argc, char **argv)
    {
    	string str1 = "Une chaine de test, c'est pour tester";
    	string str2 = Replace(str1, "test", "toto");
    	cout << str1 << endl;
    	cout << str2 << endl;
     
    	cin.get();
    	return 0;
    }
    ouput :
    Une chaine de test, c'est pour tester
    Une chaine de toto, c'est pour totoer
    Hope it helps.

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Merci pyrrhon_ car je pense que ça va pas mal m'aider !!!!

    Mais une chose encore me tracasse : dans ton code les mots que tu remplacent ne sont pas effacé, les nouveaux mots sont justes collés dessus:

    Une chaine de test, c'est pour tester
    Une chaine de toto, c'est pour totoer
    Imaginons dans mon cas que le tag est %Tag1 et qu ela valeur correspondante est 12 avec cette methode j'obtient : (par exemple)

    Test du tag n°%Tag1 ?
    Test du tag n°12ag1 ?
    Et je suppose que ça doit être possible d'obtenir ceci :

    Test du tag n°%Tag1 ?
    Test du tag n°12?
    Là ce serait
    Je continu mes recherches et merci encore pyrrhon_

    PS: petite précision : je ne doit pas me servir des MFC juuste des librairies standard, cette appli est une appli Win32 !!!!

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par défaut
    Et avec des regexp y a pas moyen ?

  7. #7
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Et avec des regexp y a pas moyen ?
    Ben peut-être que si mais pour être tout à fait honete je sais pas ce que c'est
    Peut-être pourrais tu m'éclairer ?

    Je ne sais pas si je me trompe mais je trouve que ça resemble vachement à un "Printf" !! Alors je prospecte dans cette direction
    MERCI

  8. #8
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Sans modifier la fonction Replace que j'ai fourni:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string str1 = "Test du tag n°%Tag1 ? ";
    string str2 = Replace(str1, "%Tag1", "12");
    cout << str1 << endl;
    cout << str2 << endl;
    output:
    Test du tag n°%Tag1 ?
    Test du tag n°12 ?
    Avec un petit soucis pour l'affichage des carractères spéciaux (ici '°') dans la console, mais c'est un autre problème.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par pyrrhon_
    Sans modifier la fonction Replace que j'ai fourni:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string str1 = "Test du tag n°%Tag1 ? ";
    string str2 = Replace(str1, "%Tag1", "12");
    cout << str1 << endl;
    cout << str2 << endl;
    output:


    Avec un petit soucis pour l'affichage des carractères spéciaux (ici '°') dans la console, mais c'est un autre problème.
    D'après ce que tu as dit, ca fait parfaitement ce que tu veux.
    Donc, problème résolu, ou encore un autre détail te tracasse ?

  10. #10
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Et bien pas problème résolu du tout car je n'est pas le droit d'utiliser le string qui est un type spécifique ! Je ne doit utiliser que du char* Youpi !!
    Je ne doit me servir que des outil de la bibli std avec tout les strcpy et autres ...
    Tanpi je vais finir par y arriver mais bon merci quand même pour votre aide.

    Je n'hésiterai pas à me servir de ce forum à l'avenir car les réponses y sont très rapides !!
    Merci beaucoup encore

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par Superzobi
    Et bien pas problème résolu du tout car je n'est pas le droit d'utiliser le string qui est un type spécifique ! Je ne doit utiliser que du char* Youpi !!
    Je ne doit me servir que des outil de la bibli std avec tout les strcpy et autres ...
    Tanpi je vais finir par y arriver mais bon merci quand même pour votre aide.

    Je n'hésiterai pas à me servir de ce forum à l'avenir car les réponses y sont très rapides !!
    Merci beaucoup encore
    Bon, ben là, ca va être plus chiant.
    Je pense que tu vas devoir regarder caractère par caractère :
    Si tu trouver % puis 'T' puis 'a' puis 'g' et tant que tu as des chiffres, alors faire avancer ta variable, etc : mais voila comment je le coderai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    int i=0;
    char* s = "xfhfufbusdfbu %Tag15xwcnwx";
    char* buffer="";
    int k=0;
    boll b=false;
    while(!b)
    {
       while(s[i]!=%)
    {
         buffer[k]=s[i];
         k++;
          i++;
    }
       //maintenant, début du tag
    int j=0;
    if(s[i+1]=='T' && s[i+2]=='a' && s[i+3]=='g')
    {
        while(s[i+j+4]>0 || s[i+j+4]<9)
           j++;
        //ton tag est donc compris entre i et i+j+4
        std::ostringstream oss;
    int nb=i+j+4;
        while(i<=nb)
           oss<<s[i];
        //oss contient donc ton tag
        if(tag==regc[0]) //ton paramètre nommé ton_tag par la suite
           {
               for(int a=0;a<j+4;a++)
               buffer[k]=ton_tag[a];
               k++;
            }
    }//if(s[i+i].......
    else
    if(s[i]=='\0') //fin de fichier
    b=true;
    else
    i++;
    N'ayant pas beaucoup de temps, je ne l'ai pas testé, donc il y a surement des petites erreurs, mais c'est un début.

  12. #12
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    std::string est du C++ tout ce qu'il ya de plus standard.

    Si tu ne peux pas l'utiliser, et que tu es contraint d'utiliser des char* et strcpy de 2 choses l'une :
    - Soit tu ne fais pas du C++ mais du C, dans ce cas tu t'es planté de forum
    - Soit ca te ferait du bien de (re)ouvrir un bouquin de C++

  13. #13
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Et bien cher Ksempac je doit reconnaitre que tu as raison c'est donc que je me suis mal exprimé.
    Ce n'est pas moi qui tire les ficelles sur ce projet je suis donc obligé de respecter certaines obligations comme "Ne pas utiliser le type string mais uniquement du char*".

    Merci donc à PP(Team) pour ton bout de code que je vais m'empresser de tester.

    Merci encore !

  14. #14
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Et euh... pour quelle mystérieuse raison ne peux-tu pas utiliser des string? Il n'y a rien de plus standart en c++ (comme il a été dit, les char* c'est du C).

  15. #15
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Et bien écoute la raison est partiellement mystérieuse pour moi aussi!!
    Ce que je sais c'est que mon appli doit être la plus portable possible et doit pourvoir tourner sur d'autre plateforme que windows. C'est pourquoi je ne doit utiliser que les types de base ... du moins je crois
    Je ne suis pas très caller dans ce domaine dsl .

    Enfin bref de toute façon mon appli est en C++ ya pas de doute et je suis restreint à utiliser du char* ... voila c'est tout ce que je sais !

    Mais merci à vous quand même.

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par Superzobi
    Ce que je sais c'est que mon appli doit être la plus portable possible et doit pourvoir tourner sur d'autre plateforme que windows. C'est pourquoi je ne doit utiliser que les types de base ... du moins je crois
    std::string est tout à fait standard et portable.

    Enfin bref de toute façon mon appli est en C++ ya pas de doute et je suis restreint à utiliser du char* ... voila c'est tout ce que je sais !
    Se compliquer la vie pour le plaisir quoi.

  17. #17
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Un conseil : tu devrais te renseigner sur le pourquoi du comment de la chose.

    Je ne sais pas pour qui tu travailles et quel genre de projet tu effectues, mais c'est un peu masochiste d'utiliser des char* lorsqu'on dispose de types plus sécurisés qui font le boulot plus facilement et avec des risques moindres.

    Ton supérieur quelqu'il soit n'est surement pas insensible à l'argument "on va faire un programme plus court, plus lisible et avec moins de bugs". Donc tu devrais te renseigner pour être sur que la décision sur le char* est justifiée.

    Je le dis et je le repete : std::string est un standard du C++. Sur une plateforme standard (PC windows, Linux, etc...) il n'y a aucune raison de s'en priver...

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par Ksempac
    Un conseil : tu devrais te renseigner sur le pourquoi du comment de la chose.

    Je ne sais pas pour qui tu travailles et quel genre de projet tu effectues, mais c'est un peu masochiste d'utiliser des char* lorsqu'on dispose de types plus sécurisés qui font le boulot plus facilement et avec des risques moindres.

    Ton supérieur quelqu'il soit n'est surement pas insensible à l'argument "on va faire un programme plus court, plus lisible et avec moins de bugs". Donc tu devrais te renseigner pour être sur que la décision sur le char* est justifiée.

    Je le dis et je le repete : std::string est un standard du C++. Sur une plateforme standard (PC windows, Linux, etc...) il n'y a aucune raison de s'en priver...
    Si il est en cours, c'est juste pour lui compliquer la tache.
    Par exempel, en cours, on nous a demandé de reprogrammer une partie de la STL. Quelle intérêt ??? Aucun, sauf nous apprendre à réflèchir.
    Son prof (si c'est bien un prof) sait bien que beaucoup de fonctions (de string) facililent la tache, c'est pourquoi, à mon avis, il leur a demandé de faire avec des char*.

    NB : pas persuadé que String soit multiplateforme.

  19. #19
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    La classe string est parfaitement multi-plateforme, et au delà des avantages déjà cités (portabilité, maintenabilité, facilité au développemet, robustesse du code) cette classe permet de résoudre plus facilement les problématiques d'encodage. Il n'y a aucune bonne raison à utiliser les char* en C++, si ce n'est d'apprendre à programmer en C ...

  20. #20
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par pyrrhon_
    La classe string est parfaitement multi-plateforme, et au delà des avantages déjà cités (portabilité, maintenabilité, facilité au développemet, robustesse du code) cette classe permet de résoudre plus facilement les problématiques d'encodage. Il n'y a aucune bonne raison à utiliser les char* en C++, si ce n'est d'apprendre à programmer en C ...
    Tu viens de citer la plus importante : "Cette classe permet de résoudre plus facilement les problèmes d'encodage".
    Son projet serait bien plus facile avec des string, donc son prof (si prof il y a) a voulu corser l'affaire, c'est tout. Au moins, ca les fait réflêchir.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Remplacer des caractères dans une chaine et enlever certains
    Par Lucas Panny dans le forum SL & STL
    Réponses: 6
    Dernier message: 12/01/2009, 14h26
  2. Réponses: 4
    Dernier message: 14/11/2008, 21h00
  3. Remplacer des caractères dans une chaine interbase 7.5
    Par zaydoun_391 dans le forum InterBase
    Réponses: 1
    Dernier message: 15/04/2008, 16h57
  4. [Tableaux] Remplacer des variables dans une chaine
    Par Ricou13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 21h48
  5. Réponses: 4
    Dernier message: 29/08/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo