Page principale | Pages associées

Un programme d'extraction de commentaires

On va essayer de faire un exemple concret d'utilisation de ce qui a été présenté. Les sources de tutoriaux contiennent beaucoup de commentaires afin d'expliquer assez précisément ce que fait chacun de ces programmes. L'idée de ce tutorial est de faire un programme supprimant naïvement les commentaires. Pour nous, un commentaire sera tout ce qui, dans une ligne suit 2 slash. On ne traite pas les commentaires /* * /

#include <iostream> #include <fstream> #include <string> using namespace std;
Tout est là. on peut commencer

// ----- programme principal ----- int main( int argc, char* argv[] ) {
la deuxième forme de main standard argc contient le nombre d'arguments passé en paramètre + 1 argv[] contient ces arguments. argv[ argc] = 0 argv[0] = commande lancée

// On teste qu'un argument a été passé en paramètre if ( argc != 2 ) { cerr << "Pas de nom de fichier fourni" << endl; return 1; // le retour indiquant un problème } // On récupére le nom du fichier a traiter (un seul fichier sera traité) ifstream file( argv[1] ); if ( !file ) { cerr << "Impossible de l'ouvrir en lecture le fichier" << endl; return 2;
le retour indicant un problème une documentation soigné pourrait permettre de distingue le retour 1 du retour 2
} string line; // La ligne courant qui sera lue while( getline( file, line ) ) {
getline permet de lire une ligne complète à partir d'un flux sans prendre en compte les espaces ou la taille de la chaîne qui sera lue

// On recherche les premiers caractères significatifs de la ligne string::size_type foundComment = line.find( "//" ); if ( foundComment == string::npos ) { // Pas de commentaire trouvé, on affiche la ligne complète cout << line << endl; } else { // Nous avons trouvé un commentaire sur cette ligne. string::size_type foundBegin = line.find_first_not_of( " \t" ); if ( foundBegin != foundComment ) { // affichage de la ligne de code cout << line.substr( 0, foundComment ) << endl; } } } }

Voilà, ce programme fonctionne exactement comme énoncé mais ne fait pas ce à quoi on pourrait s'attendre. Il y a un problème...je vous laisse chercher un peu... Trouvé ? En fait, il faudrait compléter la notion de commentaire en excluant les // contenus dans les chaînes. Ce programme n'est pas optimisé aussi bien en vitesse d'exécution qu'en nombre de lignes mais ce n'est pas du tout le but de l'exercice. Il peut être intéressant d'essayer de le changer :

La suite...


Le source complet :
#include <iostream> #include <fstream> #include <string> using namespace std; // ----- programme principal ----- int main( int argc, char* argv[] ) { // On teste qu'un argument a été passé en paramètre if ( argc != 2 ) { cerr << "Pas de nom de fichier fourni" << endl; return 1; // le retour indiquant un problème } // On récupére le nom du fichier a traiter (un seul fichier sera traité) ifstream file( argv[1] ); if ( !file ) { cerr << "Impossible de l'ouvrir en lecture le fichier" << endl; return 2; } string line; // La ligne courant qui sera lue while( getline( file, line ) ) { // On recherche les premiers caractères significatifs de la ligne string::size_type foundComment = line.find( "//" ); if ( foundComment == string::npos ) { // Pas de commentaire trouvé, on affiche la ligne complète cout << line << endl; } else { // Nous avons trouvé un commentaire sur cette ligne. string::size_type foundBegin = line.find_first_not_of( " \t" ); if ( foundBegin != foundComment ) { // affichage de la ligne de code cout << line.substr( 0, foundComment ) << endl; } } } }
00001 #include <iostream> 00002 #include <fstream> 00003 #include <string> 00004 using namespace std; 00005 // ----- programme principal ----- 00006 int main( int argc, char* argv[] ) 00007 { 00008 // On teste qu'un argument a été passé en paramètre 00009 if ( argc != 2 ) 00010 { 00011 cerr << "Pas de nom de fichier fourni" << endl; 00012 return 1; // le retour indiquant un problème 00013 } 00014 00015 // On récupére le nom du fichier a traiter (un seul fichier sera traité) 00016 ifstream file( argv[1] ); 00017 if ( !file ) 00018 { 00019 cerr << "Impossible de l'ouvrir en lecture le fichier" << endl; 00020 return 2; 00021 } 00022 00023 string line; // La ligne courant qui sera lue 00024 while( getline( file, line ) ) 00025 { 00026 // On recherche les premiers caractères significatifs de la ligne 00027 string::size_type foundComment = line.find( "//" ); 00028 if ( foundComment == string::npos ) 00029 { // Pas de commentaire trouvé, on affiche la ligne complète 00030 cout << line << endl; 00031 } 00032 else 00033 { // Nous avons trouvé un commentaire sur cette ligne. 00034 string::size_type foundBegin = line.find_first_not_of( " \t" ); 00035 if ( foundBegin != foundComment ) 00036 { // affichage de la ligne de code 00037 cout << line.substr( 0, foundComment ) << endl; 00038 } 00039 } 00040 } 00041 }

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