Page principale | Pages associées

Les fichiers ou flux

Le quatrième volet de cette saga nous apprendra à généraliser la notion de flux ( cin, et cout ) pour les fichiers. Cet exemple lira un fichier texte en entrée (ce source même) et en extraira les occurences des différents caractères alphanumériques. On utilisera un simple tableau pour compter.

#include <iostream> #include <fstream>
<fstream> contient les définitions pour utiliser les fichiers en C++.

using namespace std;
permet d'utiliser le namespace std

const int ARRAY_SIZE_MAX = 256;
permet de définir une taille pour le tableau des résultats... permet d'éviter les magic number

int main() { // Ouverture du fichier ifstream file( "tutorial4.cpp" );
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).

if ( !file ) {
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, ... )

return 1;
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 $? )

} // Tableau pour stocker les résultats; int carac[ ARRAY_SIZE_MAX ] = { 0 };
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)

unsigned char c;
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 accents

while ( file >> 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)

++carac[ 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;
} // 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 ) ) {
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.

cout << '[' << (unsigned char)i << "] = " << carac[ i ] << endl;
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 entier
} } // 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)

La suite...


Le source complet :
#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 }

Dernière modification : Sun Jul 4 20:19:13 2004