|
auteurs :
LFE, Aurelien.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:
std::cout << "coucou" << std::endl;
std::cout << "coucou\n" << std::flush; |
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.
|
|
auteur :
Loulou24 |
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*).
#include <iostream>
#include <string>
std::string chaine;
std::getline( std::cin, chaine ); |
|
|
auteur :
Loulou24 |
#include <string>
#include <sstream>
int x = 127;
std::ostringstream oss;
oss << std::hex << x;
std::string Hex = oss.str(); |
On peut de la même manière obtenir une représentation décimale (std::dec), ou octale (std::oct).
|
|
auteur :
Loulou24 |
#include <string>
#include <sstream>
std::string Hex = "7F";
int x;
std::istringstream iss( Hex );
iss >> std::hex >> x; |
On peut de la même manière convertir une représentation décimale (std::dec), ou octale (std::oct).
|
|
auteur :
Loulou24 |
Il n'existe aucun manipulateur pour la base 2 (binaire), mais on pourra y arriver au moyen de la classe std::bitset<>
#include <bitset>
#include <string>
#include <sstream>
int main()
{
std::bitset<8> b1( std::string( "01001011" ) );
unsigned long x = b1.to_ulong();
std::bitset<8> b2( 75 );
std::string s1 = b2.to_string<
char,
std::char_traits<char>,
std::allocator<char> >();
std::ostringstream oss;
oss << b2;
std::string s2 = oss.str();
} |
|
|
auteur :
Loulou24 |
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 :
Manipulateur |
Persistant |
Effet |
Manipulateurs généraux
|
flush |
non |
Force le vidage du buffer du flux et son affichage |
endl |
non |
Envoie une fin de ligne ('\n') ainsi qu'un flush |
setw(n) |
non |
Spécifie que la prochaine sortie s'effectuera sur n caractères |
setfill(c) |
oui |
Indique le caractère de remplissage pour setw |
left |
non |
Aligne la sortie à gauche lors de l'utilisation de setw |
right |
non |
Aligne la sortie à droite lors de l'utilisation de setw (comportement par défaut) |
Formatage des nombres entiers
|
dec |
oui |
Injecte / extrait les nombres sous forme décimale |
oct |
oui |
Injecte / extrait les nombres sous forme octale |
hex |
oui |
Injecte / extrait les nombres sous forme héxadécimale |
uppercase |
oui |
Affiche les lettres de la représentation héxadécimale en majuscule |
nouppercase |
oui |
Affiche les lettres de la représentation héxadécimale en minuscule (annule l'effet d'uppercase) |
Formatage des nombres flottants
|
setprecision(n) |
oui |
Spécifie le nombre de chiffres après la virgule affichés pour les nombres flottants non entiers (6 par défaut) |
fixed |
oui |
Affiche les nombres flottants en notation décimale (opposé de scientific) |
scientific |
oui |
Affiche les nombres flottants en notation scientifique (oppose de fixed) |
Formatage des booléens
|
boolalpha |
oui |
Affiche les booléens sous forme alphabétique ("true" et "false" au lieu de "0" et "1") |
noboolalpha |
oui |
Affiche les booléens sous forme de chiffre (annule l'effet de boolalpha) |
Exemple
#include <iomanip>
#include <iostream>
using namespace std;
cout << setfill(' ')
<< setw(15) << left << "Colonne 1"
<< setw(10) << left << "Colonne 2"
<< endl;
cout << setprecision(2) << fixed
<< setw(15) << left << 158.82589
<< setw(10) << left << 456.10288
<< endl;
cout << hex << uppercase
<< setw(15) << left << 255
<< setw(10) << left << 128
<< endl;
cout << boolalpha
<< setw(15) << left << true
<< setw(10) << left << false
<< endl; |
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 :
Loulou24 |
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 :
#include <iostream>
class Base
{
friend std::ostream& operator << (std::ostream& O, const Base& B);
virtual void Print(std::ostream& O) const
{
O << "Je suis une base";
}
};
class Derivee : public Base
{
virtual void Print(std::ostream& O) const
{
O << "Je suis une derivee";
}
};
std::ostream& operator << (std::ostream& O, const Base& B)
{
B.Print(O);
return O;
}
Base* B1 = new Base,
Base* B2 = new Derivee;
std::cout << *B1 << std::endl;
std::cout << *B2 << std::endl; |
|
|
auteur :
Loulou24 |
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.
#include <sstream>
#include <string>
std::ostringstream oss;
std::string Fichier[10];
for (int i = 0; i < 10; ++i)
{
oss.str("");
oss << "Image_" << i << ".bmp";
Fichier[i] = oss.str();
} |
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 :
Loulou24, Aurelien.Regat-Barrel |
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
std::string array_to_string(const unsigned char* buffer, std::size_t size)
{
std::ostringstream oss;
oss << std::hex << std::uppercase;
std::copy(buffer, buffer + size, std::ostream_iterator<int>(oss, ""));
return oss.str();
} |
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 héxadécimales en majuscule.
Si l'on souhaite personnaliser la représentation héxadécimale, on peut développer la boucle de copie comme ceci :
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
std::string array_to_string(const unsigned char* buffer, std::size_t size)
{
std::ostringstream oss;
oss << std::hex << std::uppercase;
oss << std::setfill('0');
for (std::size_t i = 0; i < size; ++i)
{
if (i != 0)
oss << ' ';
oss << "0x" << std::setw(2) << static_cast<int>(buffer[i]);
}
return oss.str();
}
int main()
{
const std::size_t size = 5;
const unsigned char data[size] = {0x0C, 0x10, 0xFF, 0x00, 0xDA};
std::cout << array_to_string(data, size) << '\n';
} |
Le code ci-dessus produit le résultat suivant :
|
Consultez les autres F.A.Q's
 
Ce document issu de http://www.developpez.com est soumis à la licence
GNU FDL traduit en français
ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.
Certaines parties de ce document sont sous copyright Marshall Cline
Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Ce document issu de http://www.developpez.com est soumis à trois licences, en fonction des contributeurs :
- Les contributions de Clément Cunin et LFE sont soumises aux termes de la la licence GNU FDL traduite en français ici.
Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et LFE tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL
traduite en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Les contributions de Marshall Cline sont sous copyright
- Pour ce qui est des autres contributions : Copyright © 2005 Developpez LLC : Tous droits réservés Developpez LLC.
Aucune reproduction, ne peut en être faite sans l'autorisation expresse de Developpez LLC.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la SACD.
|