Les flux, ou « streams » en anglais, sont des concepts fondamentaux en programmation C++. Ils représentent une séquence de données qui peuvent être lues depuis une source (entrée) ou écrites vers une destination (sortie). Les flux fournissent une abstraction permettant de manipuler différents types de périphériques d’entrée/sortie de manière uniforme, que ce soit la console, un fichier, une chaîne de caractères en mémoire ou même un périphérique réseau.
En C++, la manipulation des flux est généralement effectuée à l’aide de la bibliothèque standard
, qui fournit les classes std::istream
pour la lecture et std::ostream
pour l’écriture. Ces classes sont souvent utilisées conjointement avec les classes std::ifstream
et std::ofstream
pour la lecture et l’écriture de fichiers respectivement.

L’utilisation la plus courante des flux en C++ est la lecture et l’écriture depuis et vers la console. Par exemple, pour afficher un message à l’utilisateur, on utilise std::cout
, et pour récupérer une valeur saisie par l’utilisateur, on utilise std::cin
. Voici un exemple simple :
cpp#include
int main() {
// Afficher un message à l'utilisateur
std::cout << "Entrez un nombre entier : ";
// Lire un entier depuis la console
int nombre;
std::cin >> nombre;
// Afficher le nombre saisi par l'utilisateur
std::cout << "Vous avez saisi : " << nombre << std::endl;
return 0;
}
Dans cet exemple, std::cout
est utilisé pour afficher le message à l’utilisateur, tandis que std::cin
est utilisé pour lire la valeur saisie par l’utilisateur.
En plus des flux standard d’entrée/sortie (std::cin
et std::cout
), on peut également créer des flux personnalisés pour la lecture et l’écriture depuis et vers des fichiers. Par exemple :
cpp#include
#include
int main() {
// Créer un objet ifstream pour la lecture depuis un fichier
std::ifstream fichier_entree("fichier.txt");
// Vérifier si l'ouverture du fichier a réussi
if (!fichier_entree.is_open()) {
std::cerr << "Erreur lors de l'ouverture du fichier." << std::endl;
return 1;
}
// Lire et afficher le contenu du fichier ligne par ligne
std::string ligne;
while (std::getline(fichier_entree, ligne)) {
std::cout << ligne << std::endl;
}
// Fermer le fichier
fichier_entree.close();
return 0;
}
Dans cet exemple, un objet std::ifstream
est utilisé pour ouvrir le fichier « fichier.txt » en mode lecture. Ensuite, on lit et affiche le contenu du fichier ligne par ligne en utilisant std::getline
.
Pour l’écriture dans un fichier, on utilise un objet std::ofstream
de manière similaire :
cpp#include
#include
int main() {
// Créer un objet ofstream pour l'écriture vers un fichier
std::ofstream fichier_sortie("sortie.txt");
// Vérifier si la création du fichier de sortie a réussi
if (!fichier_sortie.is_open()) {
std::cerr << "Erreur lors de la création du fichier de sortie." << std::endl;
return 1;
}
// Écrire du contenu dans le fichier
fichier_sortie << "Bonjour le monde !" << std::endl;
fichier_sortie << "Ceci est un exemple d'écriture dans un fichier." << std::endl;
// Fermer le fichier
fichier_sortie.close();
return 0;
}
Dans cet exemple, un objet std::ofstream
est utilisé pour ouvrir le fichier « sortie.txt » en mode écriture. Ensuite, on écrit du contenu dans le fichier à l’aide de l’opérateur <<
.
En résumé, les flux en C++ sont des outils puissants pour la manipulation des entrées/sorties de données, que ce soit depuis la console, des fichiers ou d'autres sources. Ils offrent une abstraction pratique qui simplifie le traitement des données dans les programmes C++.
Plus de connaissances
Bien sûr, explorons plus en détail les concepts et les fonctionnalités des flux en C++.
-
Types de flux :
- Flux d'entrée (
std::istream
) : Ils sont utilisés pour lire des données à partir d'une source, comme la console (std::cin
) ou un fichier (std::ifstream
). - Flux de sortie (
std::ostream
) : Ils sont utilisés pour écrire des données vers une destination, comme la console (std::cout
) ou un fichier (std::ofstream
). - Flux bidirectionnels (
std::iostream
) : Ils peuvent être utilisés pour la fois la lecture et l'écriture, bien que leur utilisation soit moins courante.
- Flux d'entrée (
-
Manipulation des flux :
- Formatage des données : Les flux permettent de formater les données de sortie selon les besoins, en utilisant des opérateurs de formatage tels que
std::setw
,std::setprecision
, etc. - Contrôle de flux : Les opérateurs de contrôle de flux comme
std::endl
(pour insérer un caractère de fin de ligne) etstd::flush
(pour vider le tampon de sortie) sont disponibles. - État de flux : Les flux conservent un état interne qui peut être consulté pour détecter des erreurs ou des conditions spécifiques, comme la fin de fichier.
- Formatage des données : Les flux permettent de formater les données de sortie selon les besoins, en utilisant des opérateurs de formatage tels que
-
Gestion des erreurs :
- Les flux en C++ fournissent des mécanismes pour gérer les erreurs pendant la lecture et l'écriture des données. Par exemple,
std::ios::failbit
est défini lorsque la dernière opération de lecture ou d'écriture échoue. - Les fonctions membres comme
fail()
,bad()
eteof()
peuvent être utilisées pour vérifier l'état du flux et réagir en conséquence.
- Les flux en C++ fournissent des mécanismes pour gérer les erreurs pendant la lecture et l'écriture des données. Par exemple,
-
Utilisation des itérateurs avec les flux :
- Les flux peuvent être utilisés avec des itérateurs, ce qui permet de manipuler les données de manière plus flexible. Par exemple, on peut utiliser
std::istream_iterator
pour lire des données séquentiellement à partir d'un flux d'entrée. - Les itérateurs peuvent être utiles pour traiter des données dans des conteneurs STL directement à partir des flux, ou pour écrire des données dans des conteneurs en utilisant
std::ostream_iterator
.
- Les flux peuvent être utilisés avec des itérateurs, ce qui permet de manipuler les données de manière plus flexible. Par exemple, on peut utiliser
-
Personnalisation des flux :
- En C++, il est possible de personnaliser le comportement des flux en définissant des classes dérivées de
std::streambuf
,std::basic_ios
,std::basic_istream
etstd::basic_ostream
. - Cette personnalisation peut être utile pour des tâches avancées telles que la manipulation des caractères de fin de ligne, la conversion de l'encodage des caractères, etc.
- En C++, il est possible de personnaliser le comportement des flux en définissant des classes dérivées de
-
Flux et localisation :
- Les flux en C++ prennent en charge la localisation, ce qui permet d'effectuer des opérations de lecture et d'écriture en fonction des paramètres régionaux de l'utilisateur.
- Les facettes de localisation (
std::locale
) peuvent être utilisées pour spécifier le format des nombres, la disposition des dates et des heures, etc.
-
Gestion des fichiers et des répertoires :
- En plus des flux eux-mêmes, la bibliothèque standard C++ offre des fonctionnalités pour la manipulation des fichiers et des répertoires à l'aide des classes
std::filesystem
. - Ces classes permettent de créer, de supprimer, de déplacer et de renommer des fichiers et des répertoires, ainsi que d'interroger des informations sur leur statut et leurs attributs.
- En plus des flux eux-mêmes, la bibliothèque standard C++ offre des fonctionnalités pour la manipulation des fichiers et des répertoires à l'aide des classes
En combinant ces fonctionnalités, les flux en C++ offrent un moyen puissant et flexible de gérer les entrées et les sorties de données dans les programmes, que ce soit pour des applications simples ou des systèmes plus complexes.