Vous êtes sur la page 1sur 14

Cours de C++

Gestion des flux

Gestion des flux

Pour manipuler les flux dentres/sorties, le c++ met notre disposition des oprateurs surchargs (<< et >>) qui permettent respectivement de lire et dafficher des donnes, ces oprateurs pourront parfaitement tre redfinis dans le cas de nos classes, ce qui permettra par exemple dafficher le contenu des donnes membres dune classe lcran, ou dcrire ces mmes variables dans un fichier. 1. Gnralits sur les flux

Un flux reprsente un ensemble de donnes pouvant tre manipuls la fois en lecture et en criture. Un flux, aussi appel canal de donnes, offre une transparence vis--vis de la source ou de la destination des donnes : - Ecran, fichier, mmoire pour les types de flux de sortie. - Clavier, fichier, mmoire dentre. pour les types de flux

En c++ , tous les flux sont symboliss par des classes qui font partie de la librairie iostream.h. La classe de base est iostream.h, elle regroupe les caractristiques comme aux flux dE/S .

Mohamed ELWAFIQ

93

Chapitre 10

Cours de C++

Gestion des flux

Les deux principales classes drives de la classe iostream sont ostrem pour les flux de sortie, et istream pour les flux dentres. Toute les classes de la librairie iostream.h disposent des deux oprateurs surchargs << et >>. Loprande de gauche de loprateur << doit correspondre un objet de la classe ostream, pour loprateur >> cet oprande doit tre un objet de la classe istream. Ces deux oprateurs ont t dfinis pour les types de donnes suivants : char, short, int, long, float, double, long double, char*, void*. C++ fournie quatre flux prdfinis pour afficher ou lire des informations. cout : Flux de sortie standard (lcran par dfaut). Cette variable est un objet dune classe drive de ostream. : Flux dentre standard (le clavier par dfaut). Cette variable est un objet dune classe drive de istream. : Sortie erreur standard (lcran par dfaut). Cette variable est un objet dune classe drive de ostream. : Permet la fois denvoyer des messages derreur vers la sortie erreur standard (lcran par dfaut) et de remplir un fichier dalerte. Cette variable est un objet de la classe ostream.

cin

cerr

clog

Mohamed ELWAFIQ

94

Chapitre 10

Cours de C++

Gestion des flux

2.

Afficher lcran avec cout

Exemple void { int e=37 ; float x=4,5 ; cout<<dbut \n ; cout<<Entier : <<e<<endl ; cout<<Rel : <<x<<endl; } Commentaire - Ce programme utilise 3 fois lobjet cout pour afficher du texte lcran. - La librairie iostream.h fournit un certain nombre de mots cls qui permettent de modifier les caractristiques dun flux. Ces commandes sont utilises directement avec loprateur << en respectant la syntaxe cout<<manipulateur ;. main()

Mohamed ELWAFIQ

95

Chapitre 10

Cours de C++

Gestion des flux

Manipulateur dec hex oct ws endl ends flush setbase(int a) set fill(int c)

Rle Convertir en base dcimale Convertir en base hexadcimale Convertir en base octale Supprimer les espaces Ajouter un saut de ligne en fin de flux (= \n) Ajouter un caractre de fin de chane Vider un flux de sortie Choisir la base (0,8,10 ou 16) . 0 est la valeur par dfaut Choisir le caractre de remplissage (padding)

set Indiquer le nombre de chiffres dun precision(int c) nombre dcimal set w Exemple int e=31 ; cout<<e ; cout<<hex<<e ; Remarque Le padding consiste complter gnralement avec des espaces ou des zros, un lment affich lcran en prcisant la taille dun champ ou dune colonne (set w). Tout lment affich dont la taille est insuffisante sera complt par dfaut avec des espaces. De cette manire chaque lment affich possdera la mme taille, ce qui facilite lalignement.
Mohamed ELWAFIQ 96 Chapitre 10

Choisir la taille du champ (padding)

Cours de C++

Gestion des flux

En plus de ces manipulateurs de flux, la classe iostream fournit un ensemble de mthodes. Mthodes fill() fill(char c) prcision () prcision (int n) setf(long flag) setf(long flag,longchamp) width() width(int n) Exercice #include<iostream.h> #include<iomanip.h> #include<string.h> void main() { int e=15; cout<<"conversion"<<endl; cout<<"Entier : "<<e<<endl; cout<<"Hexadecimal : "<<hex<<e<<endl; cout<<"Octal : "<<oct<<e<<endl; Renvoie le remplissage Rle caractre de

modifie le caractre de remplissage renvoie la prcision pour le nombre dcimal modifie la prcision pour le nombre dcimal modifie une proprit formatage (format) Modifie une proprit formatage dun champ Renvoie la valeur daffichage Renvoie la valeur daffichage de de

Mohamed ELWAFIQ

97

Chapitre 10

Cours de C++

Gestion des flux

cout<<"--------------------------------------\n"; cout<<"Largeur et Padding\n"; float x=3.15; cout.setf(ios::right,ios::adjustfield); cout<<"Decimal : "<<setw(7)<<x<<endl; cout<<"Decimal : "<<setw(7)<<x+1000<<endl; cout<<"Decimal : "<< setw(7)<<setfill('0') <<x<<endl; cout<<"-------------------------------------------\n"; cout<<"Nombre de chiffres\n"; double pi=3.1415; cout<<"PI : "<<pi<<endl; cout<<"PI : "<<setprecision(3)<<pi<<endl; cout<<"PI : "<<setprecision(5)<<endl; cout<<"-------------------------------------------\n"; cout<<"Chanes, Alignement et Padding\n"; char texte[50]; strcpy(texte,"Bonjour tout le monde"); cout<<texte<<endl; cout.setf(ios::left,ios::adjustfield); cout.width(50); cout.fill('_'); cout<<texte<<endl; }

Mohamed ELWAFIQ

98

Chapitre 10

Cours de C++

Gestion des flux

3.

Saisir au clavier avec cin

Dans lexemple suivant : char chaine[10+1] ; cout<<saisir une chaine : ; char chaine [10+1]; cout<< saisir une chaine : ; cin.width(size of(chaine c)) ; cin>> chaine; La fonction width fixe le nombre de caractres affecter la variable chaine sans dbordement. La classe istream contient la fonction membre getline qui permet de saisir des chanes de caractres comprenant des espaces non accepts par loprateur >>. Le prototype de getline est :
istream &getline(char* chaine, int nombre, char fin= \n);

Avec : chaine : chane saisir. nombre : nombre maxi de caractres de la chane. fin : caractre de fin de saisie (par dfaut \n).

Mohamed ELWAFIQ

99

Chapitre 10

Cours de C++

Gestion des flux

Exercice #include<stdio.h> #include<conio.h> #include<iostream.h> #include<string.h> class voiture { char marque[20+1]; char modele[20+1]; char prix[20+1]; public: voiture(char *ma="",char *mo="",char *pr="") { *marque=*ma; *modele=*mo; *prix=*pr; } void saisie(); void affiche(); }; //-------------------------------------------------void voiture::saisie() { cout<<Marque : ; cin.getline(marque,sizeof(marque)); cout<<Modle : ; cin.getline(modele,sizeof(modele)); cout<<Prix : ; cin.getline(prix,sizeof(prix)); } //----------------------------------------------

Mohamed ELWAFIQ

100

Chapitre 10

Cours de C++

Gestion des flux

void voiture ::affiche() { cout.setf(ios::left,ios::adjustfield); cout<<"Marque : "; cout.width(20); cout<<marque; cout<<"Modle : "; cout.width(20); cout<<modele; cout<<"Prix : "; cout.width(20); cout<<prix; cout<<endl; } //------------------------------------void main() { voiture v1; v1.saisie() ; cout<<endl<< affichage \n ; v1.affiche() ; } 4. Redfinir les oprateurs de flux

Pour redfinir les oprateurs de flux on doit respecter la syntaxe suivante : Exemple class demo { public : friend ostream& operateur<<(osream&, demo&); friend istream& operateur>>(isream&, demo&); }; //------------------------------------------ostream& operateur<<(osream&, demo&); { } //-----------------------------------------istream& operateur>>(isream&, demo&); { }

Mohamed ELWAFIQ

101

Chapitre 10

Cours de C++

Gestion des flux

Commentaire Les deux oprateurs << et >> sont surdfinis en tant que fonction amie de la classe demo, de cette manire, ils pourront accder tous ces membres. Ds que loprateur << sera utilis avec comme oprande de gauche un objet de type ostream (ou driv) et comme oprande de droite, un objet de type demo ce sont les instructions de la fonction oprateur << qui seront excutes. Loprateur >> est utilis dune faon analogue. Les oprateurs << et >> peuvent tre surdfinis pour des objets dynamiques. Exemple #include<stdio.h> #include<conio.h> #include<iostream.h> #include<string.h> class voiture { char marque[20+1]; char modele[20+1]; char prix[20+1]; public: voiture(char *ma="",char *mo="",char *pr="") { *marque=*ma; *modele=*mo; *prix=*pr; } friend ostream& operator<<(ostream&, voiture&); friend istream& operator>>(istream&, voiture &); };
Mohamed ELWAFIQ 102 Chapitre 10

Cours de C++

Gestion des flux

//---------------------------------------------------------ostream& operator<<(ostream& out, voiture& v) { out.setf(ios::left, ios::adjustfield); out<<"\tMarque : "<<v.marque; out<<"\tModle : "<<v.modele; out<<"\tPrix : "<<v.prix<<endl; return out; } //-------------------------------------------------------istream& operator>>(istream& in, voiture& v) { cout<<"Marque : "; in.getline(v.marque,sizeof(v.marque)); cout<<"\tModele : "; in.getline(v.modele,sizeof(v.modele)); cout<<"\tPrix : " ; in.getline(v.prix,sizeof(v.prix)); return in; } //-----------------------------------------------void main() { voiture v1("Mercedes", "\tCLK 500", "\t19900DH"); cout<<"Saisir la marque,modele et le prix de voiture:\n"; cin>>v1; cout<<"\nAffichage:"<<endl<<v1; getch(); }

Mohamed ELWAFIQ

103

Chapitre 10

Cours de C++

Gestion des flux

Remarque Dans le cas dun pointeur vers la classe voiture, il faut redfinir les oprateurs << et >> comme par exemple : ostream& operator<<(ostream& out , voiture *v) { out.setf(ios::left,ios::adjustfield); out<<"\tMarque:"<<v -->marque; out<<"\tModle:"<<v -->modele; out<<"\tPrix:"<<v --> prix<<endl; return out; } 5. Lire partir dun fichier ou crire dans un fichier

Il suffit de crer un objet de type ofstream pour crire dans un fichier et un objet de type ifstream pour lire un fichier. Ces deux classes sont dclares dans le fichier fstream.h et elles drivent respectivement des classes ostream et istream Exemple 1 Extrait dun programme qui permet dcrire dans un fichier. ofstream fs("c:\\demo.txt"); if(!fs) { cout<<"Erreur d'criture dans ce fichier ! \a\a"; return 1; } fs<<"valeur de la donne: "; fs<<17.12; fs.close();

Mohamed ELWAFIQ

104

Chapitre 10

Cours de C++

Gestion des flux

Commentaire Un objet fs de type ostream est cr pour accder en criture au fichier c:\\demo.txt. En cas de succs de louverture du fichier demo.txt, les donnes sont crites vers le flux de fichier fs. Exemple 2 Extrait dun programme permettant de lire un fichier ifstream fe("c:\\demo.txt"); if(!fs) { cout<<"Erreurs d'ouverture ! \a\a"; return 1; } char texte[30]; double x; fe>>texte; fe>>x; cout<<texte<<x; Commentaire Un objet fe de type ifstream est cr pour accder en lecture au fichier demo.txt. Le flux fe est utilis pour rcuprer la chane et un nombre rel, qui sont affichs ensuite lcran. Remarque La fonction close, qui permet de fermer un fichier, est appele automatiquement par le destructeur des classes ofstream et ifstream.

Mohamed ELWAFIQ

105

Chapitre 10

Cours de C++

Gestion des flux

Exercice 1 Ecrire un programme permettant de rassembler les deux extraits. Exercice 2 En utilisant la notion de flux fichier, objet de type ofstream et ifstream, crire un programme permettant de stocker un texte sous forme de caractres dans un fichier quon appellera texte.txt, et ce jusqu ce que lutilisateur appuie sur la touche Esc. Ce mme programme doit permettre par la suite de lire le contenu de ce mme fichier.

Mohamed ELWAFIQ

106

Chapitre 10