C++: Avaleur et découpeur de flot

 

Il s'agit de mettre en place les classes Avaleur et Decoupeur permettant la lecture et le stockage de caractères dans un flot sans se soucier de la taille du buffer d'entrée.
 

Le problème

Voici un bout de code permettant de lire le clavier :
 
main() {
    char buf[128];
    cin >> buf;
    cout << buf;
}
 
 
Le problème est que si le nombre de caractères extraits du flôt dépasse 128, alors, il y a implosion.
 

Avaleur (1ère version)

Voici le même code avec un avaleur et donc sans le probleme de débordement de buffer. Le paramètre du constructeur permet d'indiquer à l'avaleur le caractère de fin (l'avaleur termine dès la lecture de ce caractère).
 
main() {
    Avaleur mangeTout(' ');
    mangeTout.avale(cin);
    cout << mangeTout.buffer();
}
 
 
Avec la redéfinition des opérateurs, on pourrait aussi avoir:
 
main() {
    Avaleur mangeTout(' ');
    cin >> mangeTout;
    cout << mangeTout;
}
 
 
Pour la lecture d'un caractère dans un stream, on peut utiliser la fonction get :
 
int istream::get()
 
 

Avaleur (2ème version)

Dans le code suivant, l'avaleur est paramétré par une chaine de caractères (et non un caractère simple comme précédemment).
Maintenant, l'avaleur termine dès la lecture d'un des caractères du paramètre.
 
main() {
    Avaleur mangeTout(" ;.");
    mangeTout.avale(cin);
    cout << mangeTout.buffer();
}
 
 
Avec la redéfinition des opérateurs, on pourrait aussi avoir:
 
main() {
    Avaleur mangeTout(" ;.");
    cin >> mangeTout;
    cout << mangeTout;
}
 

Découpeur

Maintenant on veut lire le flot en stockant les sous-chaines lues dans un tableau de chaines. Pendant la lecture, le découpeur construit un tableau de chaines de caractères. La lecture de la chaine courante se termine dès la lecture d'un des caractères de la première chaîne passée en argument au constructeur. Le découpeur termine sa découpe dès la lecture d'un des caractères de la deuxième chaîne de caractères passée en argument au constructeur.
Par exemple :
 
main() {
     Decoupeur decoup(";.", " ");
     cin >> decoup;
     for (i = 0; i < decoup.size(); i++) {
         cout << decoup[i] << endl;
     }
}
 
 
 
Pour un flot contenant :
 
bla;bli;blou.paf
 
 
On obtient le résultat suivant:
 
bla
bli
blou
paf