Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > Entrées / sorties avec les flux
        A quoi sert std::endl ?
        Comment saisir une chaîne contenant des espaces ?
        Comment obtenir la représentation hexadécimale d'un entier ?
        Comment obtenir un entier à partir de sa représentation hexadécimale ?
        Comment manipuler la représentation d'un nombre dans différentes bases ?
        Comment formater l'affichage sur les flux ?
        Comment surcharger correctement l'opérateur << pour afficher des objets polymorphiques ?
        Comment effacer le contenu d'un ostringstream ?
        [Exemple] Comment convertir un tableau en chaîne ?
        13.1. Manipulation de la console(7)
                Quelle est le différence entre #include <iostream.h> et #include <iostream> ?
                A quoi sert "using namespace std;" ?
                cout n'est pas reconnu à la compilation, que se passe-t-il ?
                Comment purger le buffer clavier ?
                Comment vérifier les valeurs saisies avec cin ?
                Comment faire une pause (attendre que l'utilisateur tape une touche) ?
                Est-il possible de simuler une saisie clavier ?
        13.2. Manipulation des fichiers(11)
                Comment tester l'existence d'un fichier ?
                Comment savoir si la lecture / écriture dans un fichier a réussi ?
                Comment écrire à la suite d'un fichier existant ?
                Comment détecter la fin de fichier lors de la lecture ?
                Comment calculer la taille d'un fichier ?
                Comment fonctionnent les tests d'ouverture de fichier if ( fichier ) et if ( !fichier ) ?
                Comment faire pour lire un fichier ligne par ligne ?
                Comment lire l'intégralité d'un fichier texte dans un buffer ?
                Comment compter le nombre de lignes d'un fichier ?
                Pourquoi n'ai-je pas le nombre de caractères attendus avec mon fichier ?
                Comment effectuer des lectures / écritures binaires dans un fichier ?

precedent    sommaire    suivant   


A quoi sert std::endl ?
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.


Comment saisir une chaîne contenant des espaces ?
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 );

Comment obtenir la représentation hexadécimale d'un entier ?
auteur : Loulou24
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.

#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).


Comment obtenir un entier à partir de sa représentation hexadécimale ?
auteur : Loulou24
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.

#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).


Comment manipuler la représentation d'un nombre dans différentes bases ?
auteur : Loulou24
Il existe dans la bibliothèque standard des manipulateurs de flux permettant de travailler dans l'une de ces trois bases :
  • décimale (std::dec)
  • hexadécimale (std::hex)
  • octale (std::oct)
Pour voir un exemple d'utilisation de ces manipulateurs, lisez Comment obtenir la représentation hexadécimale d'un entier ? et Comment obtenir un entier à partir de sa représentation hexadécimale ?.

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()
{
    // Conversion binaire -> décimal
    std::bitset<8> b1( std::string( "01001011" ) );
    unsigned long x = b1.to_ulong(); // x = 75

    // Conversion décimal -> binaire
    std::bitset<8> b2( 75 );

    // Version 1 : un peu lourde à écrire
    std::string s1 = b2.to_string<
        char,
        std::char_traits<char>,
        std::allocator<char> >(); // s1 = "01001011"

    // Version 2 : un peu plus sympa
    std::ostringstream oss;
    oss << b2;
    std::string s2 = oss.str(); // s2 = "01001011"
}

Comment formater l'affichage sur les flux ?
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;

// Un petit tableau

// En-têtes de colonnes
cout << setfill(' ')
     << setw(15) << left << "Colonne 1"
     << setw(10) << left << "Colonne 2"
     << endl;

// Ligne 1
cout << setprecision(2) << fixed
     << setw(15) << left << 158.82589
     << setw(10) << left << 456.10288
     << endl;

// Ligne 2
cout << hex << uppercase
     << setw(15) << left << 255
     << setw(10) << left << 128
     << endl;

// Ligne 3
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).


Comment surcharger correctement l'opérateur << pour afficher des objets polymorphiques ?
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; // "Je suis une base" 
std::cout << *B2 << std::endl; // "Je suis une derivee"

Comment effacer le contenu d'un ostringstream ?
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]; 

// Génère une suite de noms de fichiers numérotés de 0 à 9 
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.


[Exemple] Comment convertir un tableau en chaîne ?
auteurs : Loulou24, Aurelien.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 héxadécimale d'un buffer de caractères en représentation héxadécimale à l'aide du manipulateur std::hex.

#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>

std::string array_to_string(const unsigned char* buffer, std::size_t size)
{
    std::ostringstream oss;

    // Afficher en héxadécimal et en majuscule
    oss << std::hex << std::uppercase;

    // Injecter tous les caractères sous forme d'entiers dans le flux
    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;

    // Afficher en héxadécimal et en majuscule
    oss << std::hex << std::uppercase;

    // Remplir les blancs avec des zéros
    oss << std::setfill('0');

    for (std::size_t i = 0; i < size; ++i)
    {
        // Séparer chaque octet par un espace
        if (i != 0)
            oss << ' ';

        // Afficher sa valeur hexadécimale précédée de "0x"
        // setw(2) permet de forcer l'affichage à 2 caractères
        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 :

0x0C 0x10 0xFF 0x00 0xDA

precedent    sommaire    suivant   

Consultez les autres F.A.Q's

Valid XHTML 1.1!Valid CSS!


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.
Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com