/**
*
* @File : Balises.cxx
*
* @Authors : D. Mathieu
*
* @Date : 06/03/2001
*
* @Version : V1.0
*
* @Synopsis : Test
*
*/
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
namespace
{
/* */
void AfficherBalises (istream & is)
{
bool inBalise;
for (char Car; is.get (Car); )
{
// Ligne ajoutée pour afficher sur une seule ligne des balises
// à cheval sur plusieurs lignes
if ('\n' == Car || '\r' == Car) continue;
if ('<' == Car) inBalise = true;
if (inBalise) cout << Car;
if ('>' == Car)
{
inBalise = false;
cout << endl;
}
}
} // AfficherBalises()
/* */
// Autre solution :
/** /
void AfficherBalises (istream & is)
{
for (char Car; is.get (Car); )
{
if ('<' == Car)
for ( ; Car != '>'; is.get (Car))
// Test ajouté pour afficher sur une seule ligne des balises
// à cheval sur plusieurs lignes
if ('\n' != Car && '\r' != Car) cout << Car;
cout << '>' << endl;
}
} // AfficherBalises()
/* */
void Essai_01 (void)
{
string Str;
ifstream is ("TpTriVect.html");
AfficherBalises (is);
} // Essai_01()
typedef vector <string> CVString;
void StockerBalises (istream & is, CVString & Vect)
{
string Str;
const string CstStrVide;
for (; getline (is, Str, '\n'); )
{
// Suppression du caractère '\r' précédant (éventuellement) '\n'
if ('\r' == Str [Str.size() - 1]) Str.erase (Str.size() - 1);
// Extraction de toutes les balises de la ligne
string::size_type PosDebut = 0;
string::size_type PosFin;
// Boucler sur la ligne lue tant qu'il y a un début de balise
// à partir de la position PosDebut
for ( ; string::npos != (PosDebut = Str.find ('<', PosDebut)); )
{
// Recherche de la fin de la balise, éventuellement sur
// une autre ligne en concaténant cette ligne à la précédente
for (string StrNew;
string::npos == (PosFin = Str.find ('>', PosDebut));
Str += StrNew)
{
getline (is, StrNew, '\n');
// Suppression du caractère '\r' précédant
// (éventuellement) '\n'
if ('\r' == Str [Str.size() - 1])
Str.erase (Str.size() - 1);
}
// Extraction de la balise
// L'extraction de la balise, ci-dessous, nécessite la
// construction d'une chaîne intermédiaire qui est ensuite
// passée en paramètre de la fonction push_back(), qui la
// recopie dans le vecteur.
/** /
Vect.push_back (string (Str, PosDebut, PosFin - PosDebut + 1));
/**/
// L'extraction de la balise, ci-dessous, commence par
// ajouter une chaîne vide, préconstruite, dans le
// vecteur, puis la modifie directement.
/**/
Vect.push_back (CstStrVide);
Vect.back().assign (Str, PosDebut, PosFin - PosDebut + 1);
/**/
PosDebut = PosFin + 1;
}
}
} // StockerBalises()
void Essai_02 (void)
{
string Str;
ifstream is ("TpTriVect.html");
CVString V;
StockerBalises (is, V);
for (CVString::iterator i (V.begin()); i != V.end(); ++i)
cout << *i << endl;
} // Essai_02()
} // namespace anonyme
int main (void)
{
/* * / Essai_01 (); /* */
/* */ Essai_02 (); /* */
return 0;
} // main()