Documente Academic
Documente Profesional
Documente Cultură
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++
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++
2.
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++
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
Cours de C++
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++
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++
3.
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++
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++
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++
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++
//---------------------------------------------------------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++
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++
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++
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