begin process at 2012 05 30 06:20:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

récupérer les chaînes comprises entre 2 balises


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

récupérer les chaînes comprises entre 2 balises

vendredi 6 mai 2011 à 16:25:49 | récupérer les chaînes comprises entre 2 balises

mervat

bonjour,
je veux récupérer de mon texte toutes les chaines comprises entre <S> et </S>, j'espère que c'est possible et que vous pouvez m'aider à corriger ce code pour arriver au résultat voulu:
Code C/C++ :
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <iostream>

std::string RecupererChaine (const std::string& filename)
{ std::string ch, chaine = "";
  int i = 1;
  std::ifstream text(filename.c_str());
  if (!text)
   {
     std::cerr << "Unable to open the file: " << filename << std::endl;
     return 0;
   }

  while (text>> ch)
  {
    if (ch == "<S>")
	{
	  i = 1;
	  continue;
        }
	else if (i && ch == "</S>")
        {
	  i = 0;
	  continue;
	}

	if (i)
	  chaine = chaine + " " + ch;
  }
  return chaine;
}
int main(void)
{
  std::ofstream ofs ("out.txt");
  ofs << SuppBalises("in.txt" );
  return 0;

}
vendredi 6 mai 2011 à 16:30:04 | Re : récupérer les chaînes comprises entre 2 balises

mervat

Désolée, ilya une faute dans le main, c'est RecupererChaine pas SuppBalises
vendredi 6 mai 2011 à 17:49:08 | Re : récupérer les chaînes comprises entre 2 balises

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Tu n'étais pas très loin. C'est pas mal.

Quelques remarques:
- string.h et stdio.h n'ont pas de sens ici
- main(void) => main(), en C++ contrairement au C, on ne met pas void pour indiquer qu'une fonction ne prend pas d'argument.
- chaine = chaine + ch => Pour des concaténations, on préfère utiliser une classe de string bufferisés plutôt que des strings.
- Les "continue" ne me gêne pas, mais si tu peux les éviter, je te conseille de le faire.

Le souci avec ton code, c'est que si on a une balise <S> qui touche un mot, alors tu ne le voit pas.
Exemple: <S>Coucou </S>, sera découpé en "<S>Coucou" et "</S>", et donc tu ne verras pas de "<S>" tout seul.
Il te faut donc repérer ces cas.

Au final, tu as plusieurs cas:
- Cas 1: <S>mot</S>: Extraction du milieu (extractMiddle).
- Cas 2: <S>mot </S>: Extraction de la fin, quand le mot touche la balise de début (extractBegin).
- Cas 3: <S> mot</S>: Extraction du début, quand le mot touche la balise de fin (extractEnd).
- Cas 4: <S> mot </S>: Cas normal que tu as déjà géré, rien de particulier.

Je te propose ce code (il peut être encore légèrement optimisé, mais je souhaitais d'abord qu'il soit simple à comprendre).
Code C/C++ :
#include <iostream>
#include <fstream>
#include <sstream>

namespace
{
  std::string
  extractMiddle(const std::string& s)
  {
    size_t begin = s.find("<S>") + 3;
    size_t end = s.rfind("</S>");
    return s.substr(begin, end - begin);
  }

  std::string
  extractBegin(const std::string& s)
  {
    size_t begin = s.find("<S>") + 3;
    return s.substr(begin);
  }

  std::string
  extractEnd(const std::string& s)
  {
    size_t end = s.rfind("</S>");
    return s.substr(0, end);
  }

  std::string
  getString(const std::string& filename)
  {
    std::string ch = "";
    std::ostringstream res;
    bool active = false;
    std::ifstream text(filename.c_str());
    if (!text)
    {
      std::cerr << "Unable to open the file: " << filename << std::endl;
      return 0;
    }

    while (text >> ch)
    {
      if (ch.find("<S>") != std::string::npos && ch.rfind("</S>") != std::string::npos)
	res << " " << extractMiddle(ch);
      else if (ch.find("<S>") != std::string::npos)
      {
	if (ch != "<S>")
	  res << " " << extractBegin(ch);
	active = true;
      }
      else if (active && ch.rfind("</S>") != std::string::npos)
      {
	if (ch != "</S>")
	  res << " " << extractEnd(ch);
	active = false;
      }
      else if (active)
	res << " " << ch;
    }
    return res.str();
  }
}

int main()
{
  std::cout << getString("in.txt" ) << std::endl;
  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
vendredi 6 mai 2011 à 18:09:34 | Re : récupérer les chaînes comprises entre 2 balises

mervat

c'est vraiment professionnel, je vous remercie pour vos conseils et pour tous ces détails.
merci infiniment CptPingu.


Cette discussion est classée dans : récupérer, chaine, include, std, if


Répondre à ce message

Sujets en rapport avec ce message

position d'une chaine de caractére dans un fichier ecriture et lecture [ par yanlou ] salut, bon voila je veux mettre les chaine de caractére d'un fichier dans un autre fichier, j'utilise le code suivant :#include #include #include # Récupérer des valeurs depuis un fichier text [ par sokpassy85 ] Bonjour, Je souhaite récupérer des mesures contenues dans un fichier texte. J'ai fait ce bout de programme pour la récupération et l'affichage des val cryptage de cesar sur c++ [ par juniordiaw ] bjr a tous g un problemea vec mon code o faite lorske g rentre un letre il me la crypte mai sil sagi dun mo ou dune phrase il ne crypte ke la premiere traiter plusieurs fichiers dans un dossier [ par mervat ] bonjour, je veux faire les mêmes traitements pour chaque fichier d'un dossier, je vais donner un exemple pour que vous me comprenez plus: supposons qu éliminer les mots vides d'un fichier texte [ par mervat ] bonjour, j'ai un petit truc qui me bloque, je veux éliminer du fichier texte in les mots qui existent dans le fichier texte motvide et mettre le résul Traitement caractères [ par baptchr55 ] Bonjour à tous, je sollicite à nouveau votre aide suite à un problème de traitement de caractères... Je reçoit une trame (par le biais de sockets) et Le multithreading et variable générales [ par vbfrance102 ] salut si qlq'un peut m'aider je suis débutant en c et j'essaye de faire une petit jeu qui a 1 threads sous forme de boucle infinie et je veux qu'il m probléme de linker "SDL" [ par yoshiv ] Bonjour, bonsoir. J'ai un probléme avec un exercice (morpion en SDL) [u]mon system[/u]: vista. visual c++ express 2008. Le code ou il y a le probléme comment distinguer entre fichier et repértoire! [ par almousafer ] salut tlm Je viens d'ecrire une fonction qui parcours le répertoire passé en argument et liste son contenu (merci à Fred), mais il reste encore un pb, Compiler un programme écrit en C++ utilisant une bibliothèque C. Erreurs... [ par Virus721 ] Bonjour tout le monde ! :) Voila j'essaye de me coder un petit jeu avec la bibliothèque SDL 1.2 et l'aide du site du zéro. J'essaye autant que possib


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales