Les entrées et les sorties sont organisées dans la plupart des langages récents autour du concept de flot (anglais stream), à l'aide de bibliothèques. Un flot est une suite de valeurs (caractères, entiers, flottants, objets quelconques) successivement lues ou écrites. Ces flots sont classifiés en flots d'entrée (qui comportent des méthodes de lecture), et en flots de sortie (qui comportent des méthodes d'écriture). Outre le programme, un flot d'entrée est connecté à une source, et un flot de sortie à une cible. La source ou la cible d'un flot peut être un le clavier ou l'écran, un fichier, un tampon en mémoire, une chaîne de caractères, etc.
Le type des flots en écriture est ostream (o pour output) celui des flots en lecture est istream (i pour input). Comme ces types sont des classes, au sens de C++, les opérations sur les flots doivent être programmées dans le style à objets : on utilisera donc des constructeurs d'objets et des méthodes, ce qui explique la syntaxe légèrement différente dans les exemples suivants. Quand l'exécution d'un programme commence, les flots d'entrée standard, de sortie standard et de sortie d'erreur standard, désignés respectivement par les noms cin, cout et cerr, sont déjà créés.
Le type des flots en écriture sur un fichier est ofstream (o pour output, f pour file), celui des flots en lecture est ifstream, celui des flots en lecture et en écriture est fstream. Ces trois types sont déclarés dans <fstream>.
Un flot sur un fichier est créé (ou ouvert) au moyen d'un constructeur
du type ofstream (pour écriture) ou ifstream (pour
lecture), qui prend en argument le nom du fichier (ou son chemin d'accès
complet) ; ce nom doit être une chaîne littérale ou un tableau de
char terminé par '\0'
:
ifstream ifs("donnees"); // en lecture ofstream ofs("resultats"); // en écriture fstream fs("archives", ios::app); // en ajout
pour créer trois flots sur les fichiers donnees, resultats et archive du répertoire courant, dans chacun des trois principaux modes d'accès : en lecture, en écriture (ce qui écrase le contenu précédent), et en ajout (c'est-à-dire en écriture à la fin du fichier).
Avant de tenter de lire ou d'écrire sur un fichier, il est fortement conseillé de tester si l'ouverture a réussi, en appelant la méthode booléenne is_open :
ifstream ifs("resultats"); if (!ifs.is_open()) { cerr << "erreur : resultats ne peut pas être ouvert\n"; exit(1); }