Anda di halaman 1dari 7

Les flux dentre / sortie

Un flux(ou stream) est une abstraction logicielle reprsentant un flot de donnes entre :
une source produisant de linformation
une cible consommant cette information.
Il peut tre reprsent comme un buffer et des mcanismes associs celuici et il prend en
charge, quand le flux est cr, lacheminement de ces donnes. Un flux est associ un fichier
ou un priphrique.
Les flux d'entre sont de type istream, comme par exemple cin.
Le clavier est un istream qui se nomme std::cin .
Les flux de sortie sont de type ostream, comme par exemple cout.
L'cran est un ostream qui se nomme std::cout.
La sortie d'erreur est un ostream qui se nomme std::cerr .
La classe iostream permet de combiner flux de sortie et flux d'entre
.
1. Les classes de flux dentre / sortie

Les classes de la librairie dentre / sortie de la librairie standard se subdivisent en deux


catgories distinctes :
La premire catgorie regroupe les classes de gestion des tampons dentre / sortie. Ces
classes sont au nombre de trois : la classe template basic_stringbuf, qui permet
de raliser des tampons pour les flux orients chanes de caractres, la classe template
basic_filebuf, qui prend en charge les tampons pour les flux orients fichiers, et
leur classe de base commune, la classe template basic_streambuf.
Le rle de ces classes est principalement doptimiser les entres / sorties en intercalant des
tampons dentre / sortie au sein mme du programme. Ce sont principalement des classes
utilitaires, qui sont utilises en interne par les autres classes de la librairie dentre / sortie.

La deuxime catgorie de classes est de loin la plus complexe, puisquil sagit des
classes de gestion des flux eux-mmes. Toutes ces classes drivent de la classe template
basic_ios (elle-mme drive de la classe de base ios_base, qui dfinit tous les
types et les constantes utilises par les classes de flux).

72
La classe basic_ios fournit les fonctionnalits de base des classes de flux et, en particulier,
elle gre le lien avec les tampons dentre / sortie utiliss par le flux. De cette classe de base
drivent des classes spcialises respectivement pour les entres ou pour les sorties. Ainsi, la
classe template basic_istream prend en charge toutes les oprations des flux dentre et la
classe basic_ostream toutes les oprations des flux de sortie. Enfin, la librairie standard
dfinit la classe template basic_iostream, qui regroupe toutes les fonctionnalits des
classes basic_istream et basic_ostream et dont drivent toutes les classes de gestion
des flux mixtes.

Les Classes dclares dans iostream.h et permettant la manipulation des priphriques


standards :

73
istream_withassign, ostream_withassign et iostream_withassign
: classes drives respectivement de istream, ostream et iostream et qui
surchargent l'oprateur d'affectation.

2. Les flux dentre / sortie sur fichiers


Les classes dclares dans fstream.h permettant la manipulation des fichiers.

fstreambase : classe de base pour les classes drives ifstream, ofstream et


fstream. Elle-mme est drive de ios et contient un objet de la classe filebuf
(drive de streambuf)
ifstream : classe permettant d'effectuer la lecture partir des fichiers disque
ofstream : classe permettant d'effectuer l'criture dans des fichiers sur disque
fstream : classe permettant d'effectuer des entres/sorties partir des fichiers

Les classes dclares dans strstream.h permettant de simuler des oprations


dentres/sorties avec des tampons en mmoire centrale. Elles oprent de la mme faon que
les fonctions du langage C sprintf() et sscanf() :

strstreambase : classe de base pour les classes istrstream, ostrstream

74
et strstream. Elle contient un objet de la classe strstreambuf (drive de
streambuf).
istrstream : classe drive de strstreambase et de istream permettant la
lecture dans un tampon mmoire ( la manire de la fonction sscanf)
ostrstream : classe drive de strtreambase et de ostream permettant
l'criture dans un tampon mmoire ( la manire de la fonction sprintf)
strstream : classe drive deistrstream et de iostream permettant la lecture
et l'criture dans un tampon mmoire

Lors de la manipulation des fichiers on distingue :


Les fichiers textes : contiennent des informations sous la forme de caractres (en gnral
en utilisant le code ASCII). La source dun programme C++ est un exemple de fichier
texte.
Les fichiers binaires : contiennent directement la reprsentation mmoire des
informations. Un fichier binaire peut aussi tre vu comme une squence doctets. Un
exemple de fichier binaire est le rsultat de la compilation dun programme C++
(programme excutable).

1) Ouverture de fichier:
La mthode open() permet d'ouvrir le fichier et d'associer un flux avec ce dernier.
void open(const char *nom, int mode, int prot=filebuf::openprot);
nom : nom du fichier ouvrir
mode : mode d'ouverture du fichier
Celui-ci indique de quelle faon les donnes sont lues ou crites, et ce qui se passe au moment
de l'ouverture du flux. On l'utilise surtout pour les fichiers. Voici la liste de ces bits :
ios::in : ouverture en lecture (par dfaut pour ifstream).
ios::out : ouverture en criture (par dfaut pour ofstream).
ios::app : ajout des donnes en fin de fichier.
ios::ate : positionnement la fin du fichier.
ios::trunc : supprime le contenu du fichier, s'il existe dj ; cette suppression est
automatique pour les fichiers ouverts en criture, sauf si ios::ate ou ios::app a t
prcis dans le mode

75
ios::nocreate : ne cre pas le fichier s'il n'existe pas dj ; une erreur (bit
ios::failbit positionn) est produite dans le cas o le fichier n'existe pas encore
ios::noreplace : pour une ouverture en criture, si ni ios::ate ni ios::app
ne sont positionns, le fichier n'est pas ouvert s'il existe dj, et une erreur est produite
ios::binary : Fichier binaire, ne faire aucun formatage

prot : il dfinit les droits daccs au fichier (par dfaut les permissions de lecture/criture
sont positionnes) dans le cas dune ouverture avec cration (sous UNIX).

Exemple : Utilisation de flux dentre / sortie sur un fichier


#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
// Lit les donnes :
int i;
double d, e;
cout << "Entier Reel Reel : ";
cin >> i >> d >> e;
// Enregistre ces donnes dans un fichier :
ofstream f("fichier.txt",ios::out );
if (f.is_open())
{
cout << "OK"<< endl;
f << "Les donnees lues sont : " <<
i << " " << d << " " << e << endl;
f.close();
}

return 0;
}

Repositionnement du pointeur de fichier dans un flux dentre / sortie


#include <iostream>
#include <fstream>
#include <string>
using namespace std;

76
int main(void)
{
// Ouvre le fichier de donnes :
fstream f("fichier.txt", ios_base::in | ios_base::out |
ios_base::trunc);
if (f.is_open())
{
// crit les donnes :
f << 2 << " " << 45.32 << " " << 6.37 << endl;
// Replace le pointeur de fichier au dbut :
f.seekg(0);
// Lit les donnes :
int i;
double d, e;
f >> i >> d >> e;
cout << "Les donnes lues sont : " <<
i << " " << d << " " << e << endl;
// Ferme le fichier :
f.close();
}
return 0;

Exercice :
1) Ecrire un programme C++ qui permet de saisir et de mmoriser dans un fichier nomm
rpertoire, le nom et le numro de tlphone de 5 personnes.
2) Ecrire un programme C++ qui permet dafficher lcran le contenu du fichier
rpertoire, en sautant une ligne entre chaque personne.

Solution :
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
int main() {
string nom;
int tel;
ofstream repfile("repertoire.txt");
// ou ofstrem repfile;
// repfile.open ()= ("C:/test_cpp/repertoire.txt");
if (repfile) {
for (int i = 0; i < 5; i++)
{
cout << "Personne N" << i + 1 << endl;
cout << "Nom: ";
cin >> nom;

77
repfile << nom << " ";
cout << "Telephone: ";
cin >> tel;
repfile << tel << endl;
}
return 0;
}
else
cout << "ERREUR: Impossible d'ouvrir le fichier." <<
endl;
repfile.close();
return 0;
}

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream repfile("repertoire.txt");
string nom;
int tel; // ou string line;
if (repfile) {
repfile >> nom >> tel; //getline ( repfile,line );
while (!repfile.eof())
//Tant qu'on n'est pas la fin, on ramne les
lignes
{
cout << nom << " " << tel << endl; //cout<<line;
repfile >> nom >> tel; //getline ( repfile,line
);
}
}
else
cerr << "ERREUR" << endl;
repfile.close();
return 0;
}

78

Anda mungkin juga menyukai