| ||
auteurs : LFE, Aurélien Regat-Barrel | ||
En plus de faire un retour à la ligne en ajoutant un caractère '\n', std::endl purge le buffer de sortie et force ainsi son écriture en appelant ostream::flush() (cela a le même fonctionnement que la fonction fflush() du C). Les deux lignes de code suivantes sont donc équivalentes:
Il faut donc être prudent avec son utilisation, notamment avec les fichiers, car une opération de flush n'est pas gratuite. Son utilisation fréquente peut même sérieusement grever les performances en annulant tous les bénéfices d'une écriture bufferisée.
|
| ||
auteurs : Laurent Gomila, Luc Hermitte | ||
L'opérateur >> de saisie d'une string permet de saisir des mots et donc considère les espaces comme des séparateurs.
Pour saisir une chaîne entière contenant des espaces, il faut récupérer l'intégralité de la ligne au moyen de la fonction libre std::getline() définie dans <string> (et non pas avec la fonction membre cin.getline() qui opère sur des char*).
A noter que si une variable a été extraite à l'aide de l'opérateur >> avant l'appel à std::getline, le caractère de fin de ligne peut subsister dans
le flux d'entrée ; il peut donc être nécessaire de vider celui-ci avant d'extraire une nouvelle ligne (voir Comment purger le buffer clavier ?).
Remarque : l'implémentation de la fonction getline de la bibliothèque standard fournie par Microsoft avec Visual C++ 6.0
comporte un bug ; getline lit un caractère supplémentaire après la rencontre du délimiteur. Se référer au
support Microsoft pour la correction de ce bug.
|
| ||
auteur : Laurent Gomila | ||
Le principe est le même que celui de la question Comment convertir un nombre en une string ?, sauf que l'on précise que l'on désire une représentation hexadécimale au moyen de std::hex.
On peut de la même manière obtenir une représentation décimale (std::dec), ou octale (std::oct). |
| ||
auteur : Laurent Gomila | ||
Le principe est le même que celui de la question Comment convertir une string en un entier ?, sauf que l'on précise que l'on manipule une représentation hexadécimale au moyen de std::hex.
On peut de la même manière convertir une représentation décimale (std::dec), ou octale (std::oct).
|
| ||
auteur : Laurent Gomila | ||
Il existe dans la bibliothèque standard des manipulateurs de flux permettant de travailler dans l'une de ces trois bases :
Il n'existe aucun manipulateur pour la base 2 (binaire), mais on pourra y arriver au moyen de la classe std::bitset<>
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
auteur : Laurent Gomila | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Il est possible, comme cela se faisait avec printf, de formater les informations envoyées sur un flux en utilisant ce que l'on appelle
les manipulateurs de flux. Voici un petit topo (non exhaustif) des manipulateurs les plus utilisés :
Exemple
A noter qu'il existe dans boost une bibliothèque de formatage style printf, mais plus évoluée et tirant partie des avantages offerts par
le C++ (voir boost::format).
|
| ||
auteur : Laurent Gomila | ||
Pour injecter un objet de type quelconque dans un flux de sortie, il suffit de définir un opérateur << prenant en
paramètre le flux, ainsi que l'objet à injecter.
Notez qu'ici notre surcharge d'opérateur est déclarée amie de la classe, car elle a besoin d'accéder aux données privées de
celle-ci. Cependant ce n'est pas obligatoire, notamment si les accesseurs adéquats ont été prévus dans la classe.
Le fonctionnement est le même pour l'extraction de valeurs à partir d'un flux d'entrée, via l'opérateur >> :
Le fait de prendre en paramètre un ostream ou un istream permettra d'utiliser nos surcharges avec n'importe
quel type de flux (stringstream, fstream, ...) puisque ceux-ci dérivent tous des classes ostream
(pour les flux d'entrée) et istream (pour les flux de sortie).
Notez bien que ce genre de surcharge ne peut pas être membre de la classe, car celà impliquerait que l'opérande gauche
soit l'objet et non le flux.
Enfin, si vous devez gérer l'injection et l'extraction sur une hiérarchie d'objets polymorphes, il faudra mettre en place
une petite astuce (voir Comment surcharger correctement l'opérateur << pour afficher des objets polymorphiques ?).
|
| ||
auteur : Laurent Gomila | ||
Habituellement, pour pouvoir envoyer un objet sur un flux on surcharge l'opérateur << entre un ostream et le type de notre objet. Cependant, cette fonction ne peut être membre et de ce fait elle ne peut pas non plus être virtuelle. Par contre rien ne l'empêche d'appeler une fonction membre virtuelle de l'objet passé en paramètre. Ainsi, la manière habituelle de surcharger l'opérateur << pour une hiérarchie de classes est la suivante :
|
| ||
auteur : Laurent Gomila | ||
La fonction membre ostringstream::str a deux surcharges : une sans paramètre qui renvoie le contenu du flux sous forme de string, et une autre qui accepte une chaîne en paramètre pour réinitialiser le contenu du flux. Pour vider le flux il suffit donc d'appeler cette fonction avec comme paramètre la chaîne vide.
Note : on est souvent tenté d'utiliser la fonction clear, mais celle-ci n'a rien à voir : elle remet à zéro les bits d'erreur du flux.
|
| |||
auteurs : Laurent Gomila, Aurélien Regat-Barrel | |||
De la même manière que dans Comment obtenir la représentation hexadécimale d'un entier ?, on peut obtenir la représentation hexadécimale d'un buffer de
caractères en représentation hexadécimale à l'aide du manipulateur std::hex.
On utilise ici std::copy et std::ostream_iterator<int> pour envoyer les éléments du buffer un à un au flux,
sous forme d'entiers. Le flux étant en mode hexadécimal, ceux-ci seront chacun correctement convertis. Le manipulateur std::uppercase
sert quant à lui à obtenir une représentation des lettres hexadécimales en majuscule.
Si l'on souhaite personnaliser la représentation hexadécimale, on peut développer la boucle de copie comme ceci :
Le code ci-dessus produit le résultat suivant :
|
| |||
auteur : Laurent Gomila | |||
Afin de rediriger l'entrée ou l'une des sorties standard (cin, cout, cerr ou clog) vers un
autre flux, il suffit de réaffecter leur streambuf (le streambuf est l'objet qui fait le lien entre le flux
et ce vers quoi il lit / écrit).
Afin d'accéder au streambuf d'un flux, il faut utiliser la fonction membre rdbuf (ses 2 surcharges pour être
précis) :
Ainsi, pour rediriger cout vers un fichier par exemple, il suffira de procéder ainsi :
De cette manière vous n'êtes pas limité, cette méthode permet de rediriger n'importe quel flux vers n'importe quel autre.
A noter également que si vous ne souhaitez effectuer une telle redirection que ponctuellement et pour toute la durée de
l'exécution, vous pouvez plus simplement utiliser une redirection au niveau de votre invite de commande (avec une syntaxe
dépendante de l'OS) :
|
| |||
auteur : Laurent Gomila | |||
La STL propose deux classes pour itérer sur les flux : istream_iterator et ostream_iterator
(définies dans l'en-tête <iterator>).
Dans cet exemple, l'itérateur va parcourir les éléments du tableau un à un et utiliser l'opérateur << pour les
injecter dans le flux passé en paramètre, en l'occurence ici std::cout. Le second paramètre de l'itérateur est simplement le délimiteur qui sera placé entre chaque élément.
Vous pouvez également utiliser les stream_iterator avec des classes quelconques, pourvu que leur opérateur <<
soit correctement défini.
Cela marche aussi dans l'autre sens : avec un std::istream_iterator vous pourrez extraire des valeurs / objets d'un
flux les unes après les autres, et les placer par exemple dans un tableau.
Un istream_iterator construit par défaut (comme le second ici) représentera toujours la fin du flux.
La paire de parenthèses a priori inutile autour du second istream_iterator est nécessaire : sans cela le compilateur
croirait à une déclaration de fonction. Pour éviter cela vous pouvez également déclarer les variables correspondant aux
itérateurs en dehors de l'appel :
Pour les traitements sur des flux binaires (ie. ouvertes avec l'option binary), il vaudra mieux utiliser
std::istreambuf_iterator, qui n'appliquera pas de traitement spécial aux caractères spéciaux.
| |||
lien : [Exemple] Comment manipuler un tableau de string ? |
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.