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
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.
73
istream_withassign, ostream_withassign et iostream_withassign
: classes drives respectivement de istream, ostream et iostream et qui
surchargent l'oprateur d'affectation.
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
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).
return 0;
}
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