<fstream> contient les définitions pour utiliser les fichiers en C++.#include <iostream> #include <fstream>
permet d'utiliser le namespace stdusing namespace std;
permet de définir une taille pour le tableau des résultats... permet d'éviter les magic numberconst int ARRAY_SIZE_MAX = 256;
file est un objet de type ifstream, qu'on pourrait nommer plus complètement : 'i'nput'f'ile'stream' Il prend en paramètre une chaîne pour le nom de fichier à ouvrir (ici le source du programme).int main() { // Ouverture du fichier ifstream file( "tutorial4.cpp" );
Pour simple, ce test permet de vérifier que le fichier est bien en état d'être ouvert par le programme (présence, droit en lecture, ... )if ( !file ) {
par convention (Unixienne?) un programme qui se termine mal devrait renvoyer une valeur non nulle (vous pouvez faire le test avec les commandes standards sous linux ) si vous ne voyez rien s'afficher lors de l'exécution de ce programme, affichez le retour du programme. (sous Linux : echo $? )return 1;
définit un tableau de 256 caractères de 0 à 255 et initialise tous les éléments du tableau à 0. on considère naïvement que les caractères lus seront ASCII (se pourrait ne pas être le cas)} // Tableau pour stocker les résultats; int carac[ ARRAY_SIZE_MAX ] = { 0 };
définit le caractère qui sera lu. On utilise un unsigned char ( 0 - 255 ) ce qui permet d'avoir les caractères avec les accentsunsigned char c;
extraire d'extraire un caractère du flux l'opérateur >> renvoi le flux qui lors dans test (cast en bool) renvoi son état lors de la dernière lecture (en gros)while ( file >> c ) {
Quelque soit le caractère lu, on incrément son index dans le tableau associé. Cette écriture est un raccourci pour dire carac[ c ] = carac[ c ] + 1;++carac[ c ];
ce test permet d'afficher uniquement les caractères qui sont apparus au moins une fois dans le fichier, et ceux qui ne sont pas des caractères de control.} // On boucle sur le tableau et on affiche les résultats for ( int i = 0; i < ARRAY_SIZE_MAX; ++i ) { if ( carac[ i ] && !iscntrl( i ) ) {
Affichage entre crochet du caractère courant et de son occurence dans le fichier. on notera juste le cast afin de dire au compilateur de traiter le i comme un caractère (non signé) et non pas comme un entiercout << '[' << (unsigned char)i << "] = " << carac[ i ] << endl;
} } // fin de programme, rien à faire }
Pour résumer, ces 4 premiers tutoriaux présentent très rapidement quelques notions sur le C++ du point de vue STL. Nous avons vu notamment :
Si on y ajoute les structures de contrôle, les boucles, on peut maintenant écrire tout ou presque (avec plus ou moins de bonheur)
#include <iostream> #include <fstream> using namespace std; const int ARRAY_SIZE_MAX = 256; int main() { // Ouverture du fichier ifstream file( "tutorial4.cpp" ); if ( !file ) { return 1; } // Tableau pour stocker les résultats; int carac[ ARRAY_SIZE_MAX ] = { 0 }; unsigned char c; while ( file >> c ) { ++carac[ c ]; } // On boucle sur le tableau et on affiche les résultats for ( int i = 0; i < ARRAY_SIZE_MAX; ++i ) { if ( carac[ i ] && !iscntrl( i ) ) { cout << '[' << (unsigned char)i << "] = " << carac[ i ] << endl; } } // fin de programme, rien à faire }
00001 #include <iostream> 00002 #include <fstream> 00003 using namespace std; 00004 const int ARRAY_SIZE_MAX = 256; 00005 int main() 00006 { 00007 // Ouverture du fichier 00008 ifstream file( "tutorial4.cpp" ); 00009 if ( !file ) 00010 { 00011 return 1; 00012 } 00013 00014 // Tableau pour stocker les résultats; 00015 int carac[ ARRAY_SIZE_MAX ] = { 0 }; 00016 unsigned char c; 00017 while ( file >> c ) 00018 { 00019 ++carac[ c ]; 00020 } 00021 00022 // On boucle sur le tableau et on affiche les résultats 00023 for ( int i = 0; i < ARRAY_SIZE_MAX; ++i ) 00024 { 00025 if ( carac[ i ] && !iscntrl( i ) ) 00026 { 00027 cout << '[' << (unsigned char)i << "] = " << carac[ i ] << endl; 00028 } 00029 } 00030 00031 // fin de programme, rien à faire 00032 }