C++ : TP 2 - Flux d'E/S

© D. Mathieu    mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 03/01/2000 - Dernière mise à jour : 25/01/2001

Remarques préliminaires :

Sommaire

Lecture/Affichage unique  exo_01
Lectures/Affichages multiples  exo_02
Redirection des flux standard  
Affichage d'un fichier  exo_04
Lecture d'un fichier dans une seule chaîne  exo_05
Copie de fichier à fichier  exo_06
Lecture du nom de fichier au clavier  exo_07
Validation de l'existence d'un fichier  exo_08


Lecture/Affichage unique

exo_01 [1]
    Se placer dans le répertoire courant, si ce n'est déjà fait. Y recopier les fichiers Makefile et Squelette.cxx du TP précédent.

    Recopier le fichier Squelette.cxx dans exo_01.cxx. Dans l'espace de noms anonyme, écrire la fonction Exo_01() qui lit une chaîne au clavier et l'affiche à l'écran (utiliser la fonction getline() présentée avec la classe string).

    Compiler et tester.

Corrigés : exo_01.cxx

Sommaire


Lectures/Affichages multiples

exo_02
    Recopier le fichier exo_01.cxx dans exo_02.cxx. Ecrire la fonction Exo_02() qui, dans une boucle, lit une chaîne au clavier et l'affiche à l'écran. La boucle se termine lorsque l'utilisateur tape le caractère "fin du fichier" au clavier (Ctrl+D) (utiliser la fonction eof() de la classe istream).

    Attention : contrairement à Ada, le prédicat eof() n'est vrai qu'APRES qu'une tentative de lecture a échoué. Il faut donc toujours faire une tentative de lecture avant de tester par eof() si elle a échoué ou non.

    Compiler et tester.

Corrigés : exo_02.cxx

Sommaire


Redirection des flux standard

    Utiliser le programme exo_02, sans rien y changer, pour recopier un fichier source (par exemple exo_02.cxx) dans un fichier destination (par exemple exo_02.copy). Pour cela, utiliser les possibilités de redirection offertes par Unix.

Sommaire


Affichage d'un fichier

exo_04
    Recopier le fichier exo_02.cxx dans exo_04.cxx. Ecrire la fonction Exo_04() qui, dans une boucle, lit un fichier source (par exemple exo_02.cxx) ligne par ligne et l'affiche à l'écran. La boucle se termine à la rencontre de la marque "fin-de-fichier". Le fichier est associé à un flux d'entrée de la classe ifstream. Inclure l'entête <fstream>. Utiliser l'affichage page par page ( | less ) pour éviter le défilement trop rapide de l'écran.

    Compiler et tester.

Corrigés : exo_04.cxx

Sommaire


Lecture d'un fichier dans une seule chaîne

exo_05
    Ecrire la fonction Exo_05() qui, dans une boucle, lit chaque ligne d'un fichier source (par exemple exo_05.cxx), la concatène aux précédentes dans une seule chaîne (string) et la fait suivre d'un caractère "retour chariot" ('\n'). La boucle se termine à la rencontre de la marque "fin-de-fichier". La chaîne est alors affichée à l'écran.

    Compiler et tester.

Corrigés : exo_05.cxx

Sommaire


Copie de fichier à fichier

exo_06
    Recopier le fichier exo_05.cxx dans exo_06.cxx.

    Ecrire la fonction Exo_06() qui, dans une boucle, lit un fichier source (par exemple exo_06.cxx) ligne par ligne et le recopie dans un fichier destination (par exemple exo_06.copy). Le numéro de chaque ligne doit précéder chaque ligne (sur 4 colonnes), sous la forme (par exemple) :
 
   8 : {
   9 :     void Exo_01 (void)
  10 :     {
  11 :         string S;

    La boucle se termine à la rencontre de la marque "fin du fichier". Le fichier associé à un flux de sortie est de la classe ofstream.

    En fin de boucle, afficher à l'écran le nombre totale de lignes lues et recopiées. Vérifier l'exécution correcte en affichant le fichier de sortie.

    Compiler et tester.

Corrigés : exo_06.cxx

Sommaire


Lecture du nom de fichier au clavier

exo_07
    Recopier le fichier exo_06.cxx dans exo_07.cxx.

    Ecrire la fonction Exo_07() qui lit au clavier le nom du fichier source (un string) et du fichier destination, puis effectue le même traitement que dans l'exercice 6. La tester sur des noms de fichiers valides (en particulier, s'assurer que le fichier source existe bien).

Remarque : les constructeurs des classe ifstream() et ofstream() n'acceptent pas directement des objets de la classe string, mais seulement du type NTCTS. Cette conversion peut être obtenue en utilisant la fonction c_str() membre de la classe string.

    Compiler et tester.

Corrigés : exo_07.cxx

Sommaire


Validation de l'existence d'un fichier

exo_08
    Recopier le fichier exo_07.cxx dans exo_08.cxx.

    Cet exercice est semblable au précédent, sauf en ce qui concerne l'ouverture des fichiers. Placer la lecture du nom du fichier source dans une boucle, jusqu'à ce que l'ouverture en lecture (ios::in)  soit valide. Placer la lecture du nom du fichier destination dans une boucle, jusqu'à ce que l'ouverture en écriture (ios::out) et sans remplacement (ios::noreplace) [2] soit valide.

    Compiler et tester.

Corrigés : exo_08.cxx

Sommaire


Téléchargement des corrigés :

tpflux.zip

Chemins d'accès aux sources des corrigés :

~mathieu/PARTAGE/src/tp/tpC++/tpflux/dirflux


[1] Tous les exercices de ce TP peuvent être compilés avec le compilateur Borland C++ 5.5. Rappel : l'extension standard .cxx des fichiers sources doit être remplacé par .cpp.

[2] Cette option est aussi reconnue par le compilateur Borland C++ 5.5

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique