Retrouvez l'univers nintendo sous toutes ses faces !!
 
AccueilPortailFAQS'enregistrerConnexion

Partagez | 
 

 TP3 - Les flux

Aller en bas 
AuteurMessage
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: TP3 - Les flux   Lun 17 Déc - 12:04

TP 3 - Les flux


Remarques préliminaires

Les flux sont des "supports" utilisés par un programme pour y effectuer des lectures ou des écritures (entrées/sorties). Ils sont vus comme des suites de caractères qui sont extraits ou déposés par des opérations spécifiques.

Le clavier et l'écran sont appelés flux standard d'entrées/sorties.

Les fichiers texte (en général fichiers disque) sont aussi traités comme des flux. Comme on le comprend, l'utilisation correcte des flux est donc vitale pour qu'un programme puisse communiquer avec l'extérieur.

A la structure élémentaire de "suite de caractères" des flux se superpose la structure plus générale de suite de lignes des fichiers texte : un [fichier] texte est une succession de lignes, chacune étant elle-même constituée d'une suite de caractères.

Les exercices ci-dessous sont destinés à illustrer les différentes opérations de lecture/écriture des flux, selon la structure considérée (suite de caractères ou de lignes).

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 12:09

1) - Flux standard cin considéré comme un fichier

Objectifs
Les objectifs de cet exercice sont :

  • d'utiliser le prédicat eof()
  • de montrer le fonctionnement de la fin de fichier.

Sujet
Dernier rappel ... : créer le répertoire tp/tpC++/tp_03, qui sera le répertoire courant.

Dans l'espace de noms anonyme du fichier Flux_cin.cxx, écrire la fonction Flux_cin() qui, dans une boucle, lit une ligne 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). Pour cela, utiliser la fonction-membre (méthode) eof() de la classe istream à laquelle appartient le flux standard cin.

Attention : 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.


Le résultat d'une exécution pourrait être le suivant :
Code:
Tapez des lignes suivies de <enter>
Tapez le caractere "fin-de-fichier" pour terminer la lecture

La cigale ayant fini de chanter
La cigale ayant fini de chanter
Parce que les vacances sont finies
Parce que les vacances sont finies
Il a fallu se remettre au boulot !
Il a fallu se remettre au boulot !

Corrigés

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 12:38

2) - Affichage du contenu d'un fichier

Objectifs
L'objectif de cet exercice est de nécessiter une première utilisation de la classe fstream et d'effectuer la déclaration/définition/ouverture d'un fichier flux.

Sujet

Dans votre répertoire courant (tp_03), téléchargez le fichier FicIn_tp_03_02.a mis à votre disposition et supprimez-en l'extension .a.

Dans l'espace de noms anonyme du fichier AffichFich.cxx, écrire la fonction AffichFich() qui, dans une boucle, lit le fichier source FicIn_tp_03_02 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'en-tête <fstream>.

Utiliser l'affichage page par page ( | less ) pour éviter le défilement trop rapide de l'écran.

Exécution
Remarque : on obtiendrait le même résultat en redirigeant le fichier texte proposé ici (FicIn_tp_03_02) sur l'entrée standard de l'exécutable Fic_cin de l'exercice précédent :
Code:
Fic_cin < FicIn_tp_03_02

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 12:48

3) - Lecture du nom des fichiers au clavier

Objectifs
Les objectifs de cet exercice sont :
  • d'utiliser la fonction c_str(),
  • d'utiliser pour la première fois la classe ofstream.


Sujet
Un programme est beaucoup plus général s'il est capable de traiter n'importe quel fichier (texte par exemple), dont le nom est saisi lors de l'exécution, plutôt qu'un fichier particulier dont le nom est indiqué en dur dans le code. Il en est de même s'il doit créer un fichier résultat.

Dans l'espace de noms anonyme du fichier NomFichAuKbd.cxx, écrire la fonction NomFichAuKbd() qui :

  1. saisit au clavier le nom du fichier source (un string),
  2. saisit au clavier le nom du fichier destination (un autre string),
  3. dans une boucle, lit le fichier source ligne par ligne et le recopie dans le fichier destination en numérotant "proprement" chaque ligne à partir de 1 : le numéro de chaque ligne doit précéder chaque ligne et être aligné à droite sur 4 colonnes,
  4. affiche le nombre total de lignes du fichier.

La tester sur des noms de fichiers valides (en particulier, s'assurer que le fichier source existe bien).

Rappel : les constructeurs des classes 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.

Exécution
L'affichage à l'écran pourrait être le suivant :
Code:
Nom du fichier source      : FicIn_tp_03_02
Nom du fichier destination : FicIn_tp_03_02.copy

Copie avec numerotation du fichier FicIn_tp_03_02 dans le fichier
FicIn_tp_03_02.copy

Nombre total de lignes : 20

Les premières lignes du fichier résultant sont :

Code:
1 :                    Les deux Mulets (Lafontaine)
  2 :    Deux mulets cheminaient,  l'un  d'avoine  chargé,
  3 :        L'autre  portant    l'argent        de  la  gabelle

Corrigé

Remarque :la pré-incrémentation de NbLignes lors de l'injection du numéro de ligne dans le fichier destination évite l'utilisation d'une instruction supplémentaire d'incrémentation, donc l'utilisation d'accolades.

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 13:26

4) - Validation de l'existence d'un fichier

Objectifs
Les objectifs de cet exercice sont :
  • de réaliser l'ouverture des flux différée par rapport à la déclaration,
  • d'utiliser la fonction open(),
  • d'utiliser (éventuellement) les options et ios_base::out ,
  • de mettre en oeuvre la technique d'un nombre d'essais maximal,
  • d'utiliser return dans une fonction-procédure.


Sujet
Dans la pratique, il est indispensable de vérifier qu'un fichier a bien été associé à un flux et ouvert avant de tenter d'y lire ou d'y écrire.

Dans l'espace de noms anonyme du fichier ValidFichier.cxx, écrire la fonction ValidFichier() qui :

  • saisit au clavier le nom du fichier source (un string). Placer cette saisie dans une boucle, jusqu'à ce que l'ouverture en lecture (ios_base::in) soit valide ou que trois essais infructueux aient été tentés.

    En cas d'erreurs répétées, terminer le programme après avoir affiché dans le flux de sortie standard le message suivant :
    Code:
    3 echecs d'ouverture de fichier en lecture

  • saisit au clavier le nom du fichier destination, en effectuant la même validation d'ouverture en écriture (ios_base::out) que sur le fichier source, et en affichant éventuellement le message :
    Code:
    3 echecs d'ouverture de fichier en ecriture

  • dans une boucle, lit le fichier source ligne par ligne et le recopie dans le fichier destination.


Remarque :pour pouvoir tester la validation du fichier destination, vous devez créer le fichier et le protéger en écriture avant de lancer le programme.

Corrigés

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 13:52

5) - Extractions diverses par l'opérateur >>

Objectifs
L'objectif de cet exercice est d'étudier le comportement des différents opérateurs >> d'extraction des différents "types" prédéfinis (caractères, strings, entiers, réels).

Sujet
Extration de mots

Dans un fichier texte (= dans un flux), un [color=red]mot est une suite de caractères sans caractère d'espacement (espace, tabulation, passage à la ligne suivante '\n').

Dans l'espace de noms anonyme du fichier Extractions.cxx, écrire la fonction ExtractionsMots() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l'entrée standard cin) tous les mots et les affiche à l'écran à raison d'un par ligne. La boucle se termine lorsque l'extraction échoue (fail()).

Faire plusieurs essais, en saisissant un mot par ligne, plusieurs mots sur la même ligne, en utilisant les tabulations, en saisissant des lignes vierges ou seulement composées de caractères d'espacement.

Vous devez constater que :
  • n'importe quel caractère (sauf espacement) peut être considéré comme un mot (un '.' seul par exemple),

  • tous les caractères d'espacement avant un mot sont ignorés,

  • a seule façon de terminer le programme est de taper le caractère "fin-de-fichier" (Ctrl+D). La condition d'arrêt peut donc aussi utiliser le prédicat eof()


Extration de caractères
Dans l'espace de noms anonyme du fichier Extractions.cxx, écrire la fonction ExtractionsCars() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l'entrée standard cin) tous les caractères et les affiche à l'écran à raison d'un par ligne. La boucle se termine lorsque l'extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs caractères par ligne, séparés ou non par des caractères d'espacement, en saisissant des lignes vierges ou seulement composées de caractères d'espacement.

Vous devez constater que :
[list][*]n'importe quel caractère éditable (sauf espacement) est extrait,

[*]tous les caractères d'espacement sont ignorés,

[*]la seule façon de terminer le programme est de taper le caractère "fin-de-fichier" (Ctrl+D). La condition d'arrêt peut donc aussi utiliser le prédicat eof()

Extraction d'entiers
Un entier est une suite de caractères numériques (digits) éventuellement précédé d'un signe + ou -. Pour qu'un entier soit valide, il faut que la chaîne de caractères qui le représente soit compatible avec son type :
[list][*]un entier non signé ne peut être précédé du signe -,
[*]la valeur de la chaîne ne peut excéder la valeur maximale du type correspondant (32767 pour un short, 65535 pour un unsigned, etc.

Dans l'espace de noms anonyme du fichier Extractions.cxx, écrire la fonction ExtractionsEntiers() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l'entrée standard cin) tous les entiers et les affiche à l'écran à raison d'un par ligne. La boucle se termine lorsque l'extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs entiers par ligne, séparés ou non par des caractères d'espacement, en saisissant des lignes vierges ou seulement composées de caractères d'espacement.


Vous devez constater que :
  • n'importe quel entier valide est extrait,
  • tous les caractères d'espacement sont ignorés,
  • le programme se termine au premier échec d'extraction (voir les indications ci-dessus). Le caractère "fin-de-fichier" (Ctrl+D) permet aussi de terminer la saisie. La condition d'arrêt ne doit pas utiliser le prédicat eof(), sauf si aucune erreur de saisie n'est à craindre (ce qui est plutôt rare !)


Extraction de réels
Un nombre réel peut être représenté sous deux formes dites virgule fixe ou notation scientifique (ou virgule flottante).
  • un nombre en virgule fixe est composé d'au maximum quatre parties contiguës (sans espace ou séparateur quelconque) :
    ° son signe : '+' ou '-'. S'il est absent, le nombre est considéré comme positif.

    ° sa partie entière, toujours exprimée en base 10,

    ° le caractère point décimal '.' car nous sommes dans le système anglo-saxon !

    ° sa partie décimale, elle aussi toujours exprimée en base 10,

    Si le point décimal est présent, il doit obligatoirement être précédé ou suivi d'au moins un digit décimal.

  • un nombre en notation scientifique est composé de trois parties obligatoires :

    ° un nombre réel en virgule fixe, exprimé en base 10, signé ou non,

    ° le caractère 'e' ou 'E',

    ° un nombre entier exprimé en base 10, signé ou non, qui représente la puissance de 10 par laquelle il faut multiplier la première partie pour obtenir la valeur réelle.

    De plus, pour que la chaîne représentant un nombre réel soit valide, il faut que la valeur soit compatible avec le type correspondant (float ou double).


Dans l'espace de noms anonyme du fichier Extractions.cxx, écrire la fonction ExtractionsReels() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l'entrée standard cin) tous les réels et les affiche à l'écran à raison d'un par ligne. La boucle se termine lorsque l'extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs réels par ligne, séparés ou non par des caractères d'espacement, en saisissant des lignes vierges ou seulement composées de caractères d'espacement.

Vous devez constater que :

  • n'importe quel réel valide est extrait,

  • tous les caractères d'espacement sont ignorés,

  • le programme se termine au premier échec d'extraction (voir les indications ci-dessus). Le caractère "fin-de-fichier" (Ctrl+D) permet aussi de terminer la saisie.


Les réels suivants sont valides :
Code:
123
123.45
-12e12
-12.e-12
+12.23
-.23
1234567890

La dernière valeur est valide mais tronquée : 1.23457e+09.

Les réels suivants sont invalides et terminent le programme :
Code:
-.e12
1e123456789
-e12

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 13:58

6) - Fonction de lecture get()

Objectifs
L'objectif de cet exercice est d'illustrer l'utilisation de la fonction get().

Sujet
Il est possible de ne considérer les flux [coloàr=red]que[/color] comme des suites de caractères quelconques, sans distinction entre les caractères éditables ou non, et les caractères d'espacement.

La fonction get(), membre de la classe ifstream, que nous vous proposons d'utiliser ici, extrait et renvoie le prochain caractère du flux quel qu'il soit (la classe ifstream propose trois autres versions de cette fonction, que nous vous laissons découvrir).

Dans l'espace de noms anonyme du fichier FonctionGet.cxx, écrire la fonction FonctionGet() qui, dans une boucle, lit un fichier (dont le nom est saisi au clavier) caractère par caractère et l'affiche à l'écran. La boucle se termine à la rencontre du caractère "fin du fichier".

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP3 - Les flux   Lun 17 Déc - 14:04

7) - Fonctions seekg() et tellg()

Objectifs
L'objectif de cet exercice est d'illustrer une utilisation possible des fonctions seekg() et tellg().

Sujet
La fonction tellg(), membre de la classe ifstream, permet de connaître la position courante du pointeur d'un fichier d'entrée (= rang du prochain caractère à lire).

La fonction seekg(), membre de la classe ifstream, permet de se placer sur n'importe quel octet d'un fichier d'entrée en donnant sa position dans le fichier par rapport au début, à la fin ou à la position courante du pointeur de fichier.

La combinaison de ces deux fonctions permet de connaître le nombre d'octets d'un fichier (aucune autre fonction du C++ ne le permet).

Dans l'espace de noms anonyme du fichier SeekgTellg.cxx, écrire la fonction SeekgTellg() qui affiche la taille (= nombre d'octets) d'un fichier dont le nom est saisi au clavier. Vérifier le résultat grâce aux commandes Unix ls ou wc.

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: TP3 - Les flux   

Revenir en haut Aller en bas
 
TP3 - Les flux
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Flux RSS L'Equipe
» plus possible de modifier / creer des flux RSS
» problème flux rss "paramètres non vide"
» Flux rss en anglais que faire ?
» API + Flux Winamp + 512k ...

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Nintendo-city :: Informatique :: Section C++-
Sauter vers: