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
- À 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; }
Modifié le: mardi, 7 septembre 2021, 17:55