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.

  1. Ouvrez le fichier (vide) manipulateurs.cc dans votre éditeur favori.
  2. 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;
    }
    
  3. 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).

  4. 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;
    }
     
    ...
    

Programme complet :

 
#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