C++ urgence svp

Résolu
Bonjour,
salut, désolé j'ai fais une erreur tot aleur.
j'ai u fichier txt qui contient des chaine de caracté, exemple :

CDFX = RFRPAD7
CDFX = RFRPAD8/A8
CDFX = CDXRTD3/A3
CDFX = FGDTRE2
CDFX = ATZRSD5/A5

je veux savoir si il existe une fonction en c++ qui me permet d'avoir le resultat suivant:

CDFX = RFRPAD7
CDFX = RFRPAD8
CDFX = RFRPAA8
CDFX = CDXRTD3
CDFX = CDXRTA3
CDFX = FGDTRE2
CDFX = ATZRSD5
CDFX = ATZRSA5

merçi d'avance pour votre aide

31 réponses

Résumé de la discussion

Le sujet porte sur la transformation de chaînes issues d’un fichier texte en C++, où des lignes comme CDFX = RFRPAD7 ou CDFX = RFRPAD8/A8 doivent être fusionnées selon une règle précise. Plusieurs approches proposent de lire ligne par ligne, de repérer le slash, puis de scinder la chaîne et de recomposer le résultat selon les segments avant et après le slash. D'autres approches utilisent find_first_of pour localiser le séparateur, substrings et vérifications d’égalité pour éviter les duplications, avec des exemples d’extraction et de réassemblage couvrant les cas avec et sans slash. En cas de doute, plusieurs propos confirment qu’une boucle de lecture et un buffer permettent une gestion robuste des entrées, même lorsque des lignes présentent des formats variés.

Bobot (l’IA à votre service)
  1. je ne crois pas mais bon je suis novice en C++ je serai toi je lirai mon fichier texte je le mettrai dans un buffer a chaque retour chariot je lis et j'enregistre.Je compare les caractère avec un / et si jamais c'est pareil alors le rajoute une ligne je copie ce que j'ai lu moins 2 caractère puis j'ajoute ce qu'il y a après le / plus facile a dire qu'a faire je te l'accorde.
    1
    1. Modérateur
      Tout à fait et pour faire tout ça il y a toutes les fonctions qu'il faut:
      http://www.iut-orsay.fr/dptinfo/Pedagogie/Roger.Astier/divers/clString.html
      0
  2. Bonjour, même avec un bon éditeur de texte, tu peux faire une macro pour ça, ou alors avec sed ou awk ; je te laisse le soin de regarder la documentation de awk qui est un utilitaire assez puissant pour cela !
    0
    1. bien sûr que c'est faisable je t'enverrai peut-être en mp la réponse si j'ai le temps..
      0
      1. Modérateur
        Salut,

        Pourquoi pas ici?
        0
      2. @kilianparce que ça déborde du cadre de l'intervention "vite fait". Il faut expliquer etc. Maintenant si tu veux le faire, je te laisse le soin... D'ailleurs je dois y aller,

        a+
        0
      3. Modérateur
        @purplerainmanBen non pourquoi ça dépasse le cadre de l'intervention? :-)
        0
    2. avec vim, si tu tapes exactement (<Esc> représente la touche Échap, et les retours à la ligne représentent Entrée)
      /\/
      qay0ni
      <Esc>PxxXnq@a@a@a@a

      etc. pour répéter la macro, tu peux aussi faire 100@a pour la répéter 100 fois p.ex.
      0
      1. Petite précision : à la fin, pour enregistrer le fichier et quitter, taper ZZ.
        0
        1. Contributeur
          je ne pense pas.
          0
          1. merçi les gas mais j'ai tjr ce problém, et j'ai pa trouvé de solution
            j'ai esséyé avec le code suivant mais ça me donne rien

            #include <string>
            #include <fstream>
            #include <iostream>
            using namespace std;
            int main()
            {
            // le constructeur de ifstream permet d'ouvrir un fichier en lecture
            ifstream fichier("test.txt");

            if (fichier) // ce test échoue si le fichier n'est pas ouvert
            {
            string ligne; // variable contenant chaque ligne lue

            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while (getline(fichier,ligne))
            {
            // afficher la ligne à l'écran
            cout << ligne << endl;

            // Récupération de la position du slash
            size_t pos=ligne.find_first_of("/");

            // la sous-chaine de gauche donne le 1er entier
            int a=atoi(ligne.substr(0,pos).data());

            // la sous-chaine de droite, le second
            int b=atoi(ligne.substr(pos+1).data());

            // supression du surplus
            string sousligne=ligne.substr(0,pos);

            // Affichage du résultat
            cout << a << " " << b << endl;
            }
            }

            fichier.close();
            }
            0
            1. tu comprends pourquoi je te disais que ça ne se ferait pas comme ça? T'as pas daigné m'écouter et me contacter et là tu rames et lundi approche...
              0
            2. Si tu regardais mon code avec vim ? Il marche, je l’ai testé.
              0
            3. Modérateur
              @purplerainmanYouhou! C'est un forum communautaire, on ne fait pas d'aide privée ici. Pourquoi ne pas répondre dans cette discussion? Au contraire il a bien fait de ne pas te contacter. La réponse devrait profiter à d'autres qui pourraient avoir des problèmes similaires.
              0
          2. Bon, je te donne une deuxième méthode avec awk :

            1. Télécharge awk pour windows ici : http://gnuwin32.sourceforge.net/packages/gawk.htm
            2. Crée un fichier dans le même dossier que ton fichier original, et qui contient ceci (fais un copier-coller)
            BEGIN {
            	nc=2
            	FS="/" ;
            }
            NF==1 { print }
            NF>1 {
            	print $1
            	i = 2 ;
            	while (i <= NF) {
            		print substr($1, 1, length($1) - nc) $i; 
            		i++ ;
            	}
            }
            

            3. Ouvre la ligne de commande et va dans le répertoire (dossier) de tes deux fichiers : je suppose que tu sais utiliser la commande cd
            4. Tape
            awk -f FICHIER_SCRIPT FICHIER_TEXTE > FICHIER_SORTIE

            où Fichier_script est le fichier contenant le code du point 2, fichier_texte est ton fichier de départ, et fichier_sortie est le fichier final.

            Bon, là j’espère que tu t’en sortiras. Si tu as des notions de ligne de commande ça devrait te poser aucun problème, et j’ai testé, ça marche.
            0
            1. salut, je vous remercie mais moi je doit travailél avec c++ alor si quelqu'un peux m'aidé, parsque le code que j'esséye d'ecrir doit fonctioné mais je comprend pas ou ça cloche ?!!
              0
              1. Contributeur
                Salut.
                tu ne vérifie pas que find a trouver quelque chose (dans ton cas utilise find plutot que find_first_of).
                C'est quoi cet accès à .data() ??
                Je ne comprends pas l'intéret de atoi().
                0
                1. Bonjour,
                  j'ai un fichier txt, avec ce code j'obtien pour une chaine comme ça

                  AFRZSA2-D2
                  ADDSEA3

                  le resultat

                  AFRZSA2 AFRZSD2
                  ADDSEA3 ADDSEA3 // je veux pas que cette chaine ce double je veux avoir ADDSEA3 ça doit se fair avec une boucle mais j'arrive pas de le faire !!

                  mon code :

                  #include <string>
                  #include <fstream>
                  #include <iostream>
                  using namespace std;
                  int main()
                  {

                  ifstream fichier("slash.txt");

                  if (fichier)
                  {
                  string ligne;

                  while (getline(fichier,ligne))
                  {

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

                  string sousligne1=ligne.substr(0,pos);

                  string sousligne2=ligne.substr(pos+1);

                  string sousligne3=sousligne1.substr(0,sousligne1.size()-2).append(sousligne2);

                  cout<< sousligne1 << " " << sousligne3 << endl;

                  }
                  }

                  fichier.close();
                  }
                  0
                  1. svp si ya quelqu'un qui pourrai m'aidé pour fair la boucle parsque je bloque...
                    0
                    1. Contributeur
                      tu n'as qu'à lire ce que je t'ai écris !
                      find et pas find_first_of
                      vérifie le résultat de ton find(), car si tu as des lignes sans tiret, c'est normal que ça foire.
                      au lieu de rabacher "aidez moi" réfléchi un peu à ce que tu fais.
                      0
                  2. Salut yanlou, inspire toi de mon code avec awk, parce que là, tu brûles en C.
                    0
                    1. salut, bein tu sais mnt je bloque totalment !!!
                      si ta une solution alor à l'aide !!
                      0
                      1. indice : si ça ne trouve pas le tiret, find_first_of("-") devrait renvoyer -1. Teste cette valeur.
                        0
                        1. je trouve tjr pa la solution, ya quelqu'un qui peux m'aidé !!!
                          0
                          1. Bonjour.
                            j'ai rajouter ce test :
                            if (sousligne1 == sousligne3) {
                            cout << sousligne1 << endl;
                            }
                            else {
                            cout<< sousligne1 << " " << sousligne3 << endl;
                            }

                            mais tjr j'ai le meme resultat
                            0
                            1. Bonsoir Yanlou, ça serait une idée, mais sousligne1 et sousligne3 sont des pointeurs. Pour comparer les chaînes de caractères utilise

                              if (strcmp(sousligne1, sousligne3)) {…}
                              0
                              1. j'ai mis if (strcmp(sousligne1, sousligne3)) {…} est ça m'adonné l'erreur suivante :

                                F:\stage\slach.cpp(26) : error C2664: 'strcmp' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'
                                0
                                1. ah, ce sont des objets string… pardon dans ce cas :

                                  if (sousligne1.compare(sousligne3)) {
                                  //… si pas égales
                                  }
                                  else {
                                  //… si égales
                                  }
                                  0
                                  • 1
                                  • 2