Tutoriel « entrées/sorties » 2 [HTML]
Pas à pas 2 : Reprise de l'exemple du cours (Manipulateurs, niveau 0)
Cet exercice est disponible en page 72 de l'ouvrage C++ par la pratique
On veut écrire un programme manipulateurs.cc qui permet d'écrire une matrice identité (avec que des 1 sur la diagonale et des 0 ailleurs) dans un fichier, en utilisant les manipulateurs de flot.
Cet exercice reprend pas à pas les différentes étapes pour y parvenir.
- Ouvrez le fichier (vide) manipulateurs.cc dans votre éditeur favori.
- Préparez la « coquille » vide de base accueillant
votre programme. Pour utiliser les fichiers, il faut inclure le
fichier de définitions correspondant , fstream.
#include <iostream> #include <fstream> using namespace std; int main() { return 0; } -
Définissez (prototype et définition) une fonction ecrit_matrice_identite qui aura pour but d'écrire la
matrice désirée (indiquée par sa taille, passée en argument) dans un
fichier (dont le nom est passé en argument).
- Ouvrez le flot de sortie et testez l'ouverture avec la fonction fail() ;
- Écrivez la matrice dans le fichier ouvert, en utilisant les
manipulateurs setw() et setfill(). Ces fonctions nécessitent d'inclure le
fichier de définitions iomanip.
Note: setfill() n'a pas été présentée formellement en cours; elle permet simplement de changer le caractère utilisé pour remplir le « vide » nécessaire; p.ex. cout << setfill('_'); fera que les prochains remplissages seront effectués avec des _ ; - À la fin, il ne reste plus qu'à fermer le flot avec la fonction close().
Essayez de le faire sans regarder la solution ci-dessous.
Solution :
#include <iostream> #include <fstream> #include <string> using namespace std; ... void ecrit_matrice_identite(string fichier_sortie, size_t taille); int main() { return 0; } // écrit la matrice identité dans un fichier void ecrit_matrice_identite(string fichier_sortie, size_t taille){ // ouvre le flot ofstream sortie(fichier_sortie); // en C++98 : ajouter c_str() if (sortie.fail()){ cerr << "Erreur : impossible d'ouvrir le fichier " << fichier_sortie << "en écriture." << endl; return; } sortie << setfill('0') ; for (size_t i(1); i < taille; ++i) sortie << setw(i) << '1' << setw(taille-i) << '0' << endl; sortie << setw(taille) << '1' << endl; // ferme le flot sortie.close(); cout << "Matrice sauvegardée dans le fichier " << fichier_sortie << "." << endl; }Notez bien que les manipulateurs setw n'affichent rien en eux-même mais influencent le prochain affichage ! Il est donc nécessaire d'afficher quelque chose après le setw, par exemple ici le dernier '0' (ou le dernier '1' pour la dernière ligne).
- Il ne reste plus qu'à compléter le main
pour créer la matrice, par exemple comme ici (d'autres variantes sont
possibles) :
... int main() { size_t taille(0); string fichier_sortie; cout << "Taille de la matrice :" << endl; cin >> taille; if (taille > 25) taille = 25; else if (taille < 2) taille = 2; cout << "Nom du fichier de sortie :"; cin >> fichier_sortie; // écrit la matrice identité dans le fichier ecrit_matrice_identite(fichier_sortie, taille); return 0; } ...
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
void ecrit_matrice_identite(string fichier_sortie, size_t taille);
int main()
{
size_t taille(0);
string fichier_sortie;
cout << "Taille de la matrice :" << endl;
cin >> taille;
if (taille > 25) taille = 25;
else if (taille < 2) taille = 2;
cout << "Nom du fichier de sortie :";
cin >> fichier_sortie;
// écrit la matrice identité dans le fichier
ecrit_matrice_identite(fichier_sortie, taille);
return 0;
}
// écrit la matrice identité dans un fichier
void ecrit_matrice_identite(string fichier_sortie, size_t taille){
// ouvre le flot
ofstream sortie(fichier_sortie); // en C++98 : ajouter c_str()
if (sortie.fail()){
cerr << "Erreur : impossible d'ouvrir le fichier " << fichier_sortie
<< "en écriture." << endl;
return;
}
sortie << setfill('0') ;
for (size_t i(1); i < taille; ++i)
sortie << setw(i) << '1' << setw(taille-i) << '0' << endl;
sortie << setw(taille) << '1' << endl;
// ferme le flot
sortie.close();
cout << "Matrice sauvegardée dans le fichier " << fichier_sortie << "."
<< endl;
}
Last modified: Thursday, 27 November 2025, 09:08
