Date de première publication : 2013/09/24
Flux de caractères
Nous allons traiter de la manipulation basique des flux de données et en particulier, des fichiers textes.
Pour manipuler les différents éléments, il faudra include l'entête fstream
et ne pas oublier de préfixer les choses avec std::
Cette page n'est pas censée se substituer à la documentation officielle ( ofstream, ifstream mais j'espère qu'elle est plus accessible lorsque l'on est au tout début de son apprentissage du C++ !
Vous utilisez déjà des flux (prédéfinis) dans vos programmes :
std::cout
: le flux correspondant à la sortie standardstd::cin
: le flux correspondant à l'entrée standardstd::cerr
: le flux correspondant à la sortie d'erreur standard
Ces flux peuvent bien entendu être redirigés vers des fichiers mais on peut directement accéder à des flux à des fichiers.
Écriture dans un flux
Pour voir comment on peut écrire dans un fichier, analysons le code suivant :
std::string nom = "mon_fichier.txt";
std::ofstream fichier(nom.c_str());
if (!fichier.fail()) {
fichier << quantite << std::endl;
for (int i = 0; i < quantite; ++i)
fichier << i+1 << std::endl;
fichier.close();
- Ligne 1 : déclaration d'une variable de type
string
contenant le nom du fichier - Ligne 2 : déclaration d'une variable de type flux en écriture, le constructeur prend en paramètre le nom du fichier.
On peut obtenir le même résultat en appelant la méthode
open()
- Ligne 4 : si fichier est non nul, alors le fichier est ouvert sinon il y a eu un problème
- Lignes 5 et 7 : on écrit dans un fichier de la même manière que l'on utilise
std::cout
- Ligne 9 : on ferme le flux. Dans notre cas, c'est optionnel car le destructeur du flux le fait pour nous juste après.
Si vous ne savez pas ce qu'est nom.c_str()
, relisez la partie sur les chaînes de caractères.
Lecture à partir d'un flux
std::ifstream fichier; // autre manière d'ouvrir un fichier
int i = 0, max;
fichier.open(nom.c_str());
// fail() pas testé :-(
fichier >> max;
while(!fichier.eof() && i<max) {
double lecture;
fichier >> lecture;
++i;
std::cout << lecture << " ";
}
fichier.close();
- Ligne 1 : déclaration d'un flux en lecture
- Ligne 4 : association du flux et d'un fichier avec ouverture
- Ligne 6 : lecture dans le fichier
- Ligne 8 : test du drapeau
eof()
mis à jour uniquement après une lecture
Types de flux
Nous venons de voir un premier type de flux (flux de caractères pour des fichiers texte). La page sur les chaînes de caractères vous donne un exemple de flux qui n'est pas associé à un fichier mais à une chaîne de caractères, pratique non ?
On peut manipuler des flux binaires mais le concept de serialisation n'existe pas en C++.