Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (2)
No preview for this file type
...@@ -147,7 +147,7 @@ numérique (discrète). Il en existe deux grandes catégories : ...@@ -147,7 +147,7 @@ numérique (discrète). Il en existe deux grandes catégories :
% {raw:latex}`\clearpage` % {raw:latex}`\clearpage`
+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "696d89dd98b4217c97e8f8f9da12c80c", "grade": true, "grade_id": "40", "locked": false, "points": 0, "schema_version": 3, "solution": true}} +++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "541fa69d3773a8dd58dce87cd6cc360e", "grade": true, "grade_id": "40", "locked": false, "points": 0, "schema_version": 3, "solution": true}}
::::{admonition} Exercice 4 : $\clubsuit$ ::::{admonition} Exercice 4 : $\clubsuit$
...@@ -184,11 +184,11 @@ suivante : ...@@ -184,11 +184,11 @@ suivante :
``` c++ ``` c++
/** lit une ligne d'un flux et la stocke dans une chaîne de caractères /** lit une ligne d'un flux et la stocke dans une chaîne de caractères
* @param f un flux entrant * @param flux un flux entrant
* @param s une chaîne de caractères * @param s une chaîne de caractères
* @return le flux entrant * @return le flux entrant
**/ **/
istream getline(istream &f, string &s); istream getline(istream &flux, string &s);
``` ```
% REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
......
Noel
42
...@@ -27,11 +27,11 @@ rise: ...@@ -27,11 +27,11 @@ rise:
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
# État d'un fichier (ou d'un flux) # État d'un flux
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
Jusqu'ici nous avions principalement fait du calcul. Dans ces Jusqu'ici nous avions principalement fait du calcul. Dans ces
derniers, les situations exceptionnelles sont relativement rares : derniers, les situations exceptionnelles sont relativement rares :
divisions par zéro, préconditions, ... divisions par zéro, préconditions, ...
...@@ -49,7 +49,7 @@ De ce fait, les opérations peuvent échouer. ...@@ -49,7 +49,7 @@ De ce fait, les opérations peuvent échouer.
Dans cette feuille, nous allons voir comment détecter ces échecs pour Dans cette feuille, nous allons voir comment détecter ces échecs pour
pouvoir ensuite les gérer. Cela utilisera la notion d'**état d'un pouvoir ensuite les gérer. Cela utilisera la notion d'**état d'un
fichier**. flux**.
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
...@@ -144,18 +144,18 @@ entrées une à une tant que la lecture se passe bien. ...@@ -144,18 +144,18 @@ entrées une à une tant que la lecture se passe bien.
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
### État d’un fichier ### État d’un flux
+++ {"slideshow": {"slide_type": "fragment"}} +++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Définition :::{admonition} Définition
Une variable de type fichier peut être dans un ***bon état*** : Une variable de type flux peut être dans un ***bon état*** :
- «jusqu’ici tout va bien» - «jusqu’ici tout va bien»
ou un ***mauvais état*** : ou un ***mauvais état*** :
- fichier non trouvé à l’ouverture, problème de permissions - fichier non trouvé à l’ouverture ou problème de permissions
- lecture ou écriture incorrecte - lecture ou écriture incorrecte
- fin du fichier atteinte - fin du fichier atteinte
- plus de place disque - plus de place disque
...@@ -166,10 +166,10 @@ ou un ***mauvais état*** : ...@@ -166,10 +166,10 @@ ou un ***mauvais état*** :
:::{admonition} Syntaxe :::{admonition} Syntaxe
``` c++ ``` c++
if ( fichier ) { ... if ( flux ) { ...
``` ```
``` c++ ``` c++
if ( fichier >> i ) { ... if ( flux >> i ) { ...
``` ```
::: :::
...@@ -250,7 +250,7 @@ annuaire.close(); ...@@ -250,7 +250,7 @@ annuaire.close();
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
### Bonne pratique : vérifier l’état d’un fichier ### Bonne pratique : vérifier l’état d’un flux
+++ {"slideshow": {"slide_type": "fragment"}} +++ {"slideshow": {"slide_type": "fragment"}}
...@@ -260,7 +260,7 @@ L'autre inconnue est : le fichier existe-t-il? ...@@ -260,7 +260,7 @@ L'autre inconnue est : le fichier existe-t-il?
:::{hint} Bonne pratique :::{hint} Bonne pratique
Toujours vérifier l'état d'un fichier après toute opération pouvant Toujours vérifier l'état d'un flux après toute opération pouvant
échouer, et notamment l'ouverture échouer, et notamment l'ouverture
::: :::
...@@ -284,7 +284,7 @@ using namespace std; ...@@ -284,7 +284,7 @@ using namespace std;
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
ifstream fichier; ifstream flux;
``` ```
```{code-cell} ```{code-cell}
...@@ -292,7 +292,7 @@ ifstream fichier; ...@@ -292,7 +292,7 @@ ifstream fichier;
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
fichier.open("annuaire.txt"); // Un fichier existant flux.open("annuaire.txt"); // Un fichier existant
``` ```
```{code-cell} ```{code-cell}
...@@ -300,7 +300,7 @@ fichier.open("annuaire.txt"); // Un fichier existant ...@@ -300,7 +300,7 @@ fichier.open("annuaire.txt"); // Un fichier existant
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
if ( not fichier ) { if ( not flux ) {
cout << "Erreur à l'ouverture" << endl; cout << "Erreur à l'ouverture" << endl;
} }
``` ```
...@@ -310,7 +310,7 @@ if ( not fichier ) { ...@@ -310,7 +310,7 @@ if ( not fichier ) {
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
fichier.close(); flux.close();
``` ```
```{code-cell} ```{code-cell}
...@@ -318,7 +318,7 @@ fichier.close(); ...@@ -318,7 +318,7 @@ fichier.close();
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
fichier.open("oups.txt"); // Un fichier non existant flux.open("oups.txt"); // Un fichier non existant
``` ```
```{code-cell} ```{code-cell}
...@@ -326,17 +326,20 @@ fichier.open("oups.txt"); // Un fichier non existant ...@@ -326,17 +326,20 @@ fichier.open("oups.txt"); // Un fichier non existant
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
if ( not fichier ) { if ( not flux ) {
cout << "Erreur à l'ouverture" << endl; cout << "Erreur à l'ouverture" << endl;
} }
``` ```
+++ {"slideshow": {"slide_type": "fragment"}} +++ {"slideshow": {"slide_type": "fragment"}}
:::{hint} Bonne pratique :::{admonition} Bonne pratique
:class: hint
Pour mieux signaler cette situation exceptionnelle, il est recommandé Pour mieux signaler cette situation exceptionnelle, il est recommandé
d'utiliser les **exceptions**, que nous avons introduites lors du d'utiliser une **exception** (voir
[cours précédent](../Semaine7/cours-exceptions.md). [Semaine7](../Semaine7/cours-exceptions.md)).
::: :::
```{code-cell} ```{code-cell}
...@@ -352,7 +355,7 @@ slideshow: ...@@ -352,7 +355,7 @@ slideshow:
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
if ( not fichier ) { if ( not flux ) {
throw runtime_error("Erreur à l'ouverture du fichier"); throw runtime_error("Erreur à l'ouverture du fichier");
} }
``` ```
...@@ -361,14 +364,14 @@ if ( not fichier ) { ...@@ -361,14 +364,14 @@ if ( not fichier ) {
## Résumé ## Résumé
Lorsque l'on manipule des fichiers, les opérations sont succeptibles Lorsque l'on manipule des fichiers et des flux, les opérations sont
d'échouer. Dans cette feuille, nous avons vu que la notion d'**état de susceptibles d'échouer. Dans cette feuille, nous avons vu que la
fichier** permet de détecter de tels échecs pour les traiter. Il est notion d'**état de flux** permet de détecter de tels échecs pour les
fortement recommandé de **systématiquement vérifier l'état du fichier traiter. Il est fortement recommandé de **systématiquement vérifier
après toute opération pouvant échouer**, et tout particulièrement l'état du flux après toute opération pouvant échouer**, et tout
après l'ouverture d'un fichier, et de **signaler un tel échec au moyen particulièrement après l'ouverture d'un fichier, et de **signaler un
d'une exception**. tel échec au moyen d'une exception**.
La notion d'état d'un fichier peut aussi être mise à profit avec La notion d'état d'un flux s'utilise naturellement avec l'idiome «lire
l'idiome «lire dans un fichier tant que la lecture se passe bien». depuis un flux tant que la lecture se passe bien».
...@@ -77,7 +77,7 @@ slideshow: ...@@ -77,7 +77,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Déclaration // Déclaration
ofstream fichier; ofstream flux;
``` ```
```{code-cell} ```{code-cell}
...@@ -86,7 +86,7 @@ slideshow: ...@@ -86,7 +86,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Ouverture // Ouverture
fichier.open("bla.txt"); flux.open("bla.txt");
``` ```
```{code-cell} ```{code-cell}
...@@ -95,7 +95,7 @@ slideshow: ...@@ -95,7 +95,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Écriture // Écriture
fichier << "Noël " << 42 << endl; flux << "Noël " << 42 << endl;
``` ```
```{code-cell} ```{code-cell}
...@@ -104,7 +104,7 @@ slideshow: ...@@ -104,7 +104,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Fermeture // Fermeture
fichier.close(); flux.close();
``` ```
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
...@@ -113,7 +113,7 @@ fichier.close(); ...@@ -113,7 +113,7 @@ fichier.close();
Écrire dans un fichier se fait en **quatre étapes** : Écrire dans un fichier se fait en **quatre étapes** :
1. Déclaration 1. Déclaration du flux
2. Ouverture du fichier 2. Ouverture du fichier
3. Écriture 3. Écriture
4. Fermeture du fichier 4. Fermeture du fichier
...@@ -143,7 +143,7 @@ slideshow: ...@@ -143,7 +143,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Déclaration // Déclaration
ifstream fichier; ifstream flux;
``` ```
```{code-cell} ```{code-cell}
...@@ -152,7 +152,7 @@ slideshow: ...@@ -152,7 +152,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Ouverture du fichier // Ouverture du fichier
fichier.open("bla.txt"); flux.open("bla.txt");
``` ```
```{code-cell} ```{code-cell}
...@@ -162,7 +162,7 @@ slideshow: ...@@ -162,7 +162,7 @@ slideshow:
--- ---
string s; string s;
// Lecture // Lecture
fichier >> s; flux >> s;
s s
``` ```
...@@ -172,7 +172,7 @@ slideshow: ...@@ -172,7 +172,7 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
int i; int i;
fichier >> i; flux >> i;
i i
``` ```
...@@ -182,20 +182,47 @@ slideshow: ...@@ -182,20 +182,47 @@ slideshow:
slide_type: fragment slide_type: fragment
--- ---
// Fermeture du fichier // Fermeture du fichier
fichier.close(); flux.close();
``` ```
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
:::{admonition} À retenir :::{admonition} À retenir
:class: hint
De même que l'écriture dans un fichier, la lecture se fait en **quatre De même que l'écriture dans un fichier, la lecture se fait en **quatre
étapes** : étapes** :
1. Déclaration 1. Déclaration du flux
2. Ouverture du fichier 2. Ouverture du fichier
3. Lecture 3. Lecture
4. Fermeture du fichier 4. Fermeture du fichier
::: :::
+++ {"slideshow": {"slide_type": "slide"}}
:::{admonition} À retenir
:class: hint
- La lecture et l'écriture se fait en fonction du type des données.
- À la lecture, les espaces, tabulations et sauts de lignes servent de
séparateurs entre entiers, mots, etc.
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} À retenir
:class: hint
Comme nous utilisons un flux pour lire depuis un fichier, la lecture
se fait de façon séquentielle depuis le début du fichier. De même pour
l'écriture, il est nécessaire de réécrire l'intégralité du fichier.
Il existe d'autres façons d'accéder à un fichier permettant de n'en
lire ou n'en modifier qu'une fraction -- on parler d'accès aléatoire
(*random access*) -- mais nous n'en aurons pas besoin ce semestre.
:::
...@@ -81,9 +81,8 @@ Comment extraire ces nombres de `s`? ...@@ -81,9 +81,8 @@ Comment extraire ces nombres de `s`?
+++ {"slideshow": {"slide_type": "notes"}} +++ {"slideshow": {"slide_type": "notes"}}
On souhaiterait extraire ces nombres en les convertissant en entiers. On souhaiterait extraire ces nombres en les convertissant en entiers.
Pour cela on créé un *flux* de type `istringstream` (nous verrons dans Pour cela on créé un *flux* de type `istringstream` (pour flux entrant
la feuille suivante ce qu'est un flux et la signification du nom depuis une chaîne de caractères) rattaché à `s` :
`istringstream`) :
```{code-cell} ```{code-cell}
--- ---
...@@ -150,14 +149,15 @@ i ...@@ -150,14 +149,15 @@ i
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
L'exemple suivant illustre que l'on peut lire successivement des L'exemple suivant illustre que l'on peut lire successivement des
valeurs de types mixtes, et que l'on peut chaîner ces lectures : valeurs de types mixtes, qu'un nombre quelconque d'espaces sert de
séparateur, et que l'on peut enchaîner ces lectures :
```{code-cell} ```{code-cell}
--- ---
slideshow: slideshow:
slide_type: fragment slide_type: fragment
--- ---
string s = "truc 33 bidule 2.5 reste" string s = "truc 33 bidule 2.5 reste"
``` ```
```{code-cell} ```{code-cell}
...@@ -258,9 +258,8 @@ caractères. Le principe sera le même que pour une lecture. ...@@ -258,9 +258,8 @@ caractères. Le principe sera le même que pour une lecture.
+++ {"slideshow": {"slide_type": "fragment"}} +++ {"slideshow": {"slide_type": "fragment"}}
On commence par définir un flux de type `ostringstream` (là encore, On commence par définir un flux de type `ostringstream` (pour flux
nous verrons dans la feuille suivante la signification du nom de ce sortant vers une chaîne de caractères) :
type) :
```{code-cell} ```{code-cell}
--- ---
...@@ -464,9 +463,11 @@ CHECK( formateEntreeAnnuaire("Lovelace", "Ada", "07 23 23 23 23") ...@@ -464,9 +463,11 @@ CHECK( formateEntreeAnnuaire("Lovelace", "Ada", "07 23 23 23 23")
## Résumé ## Résumé
Dans cette feuille: Dans cette feuille:
- nous avons vu comment **lire et écrire** des données de types divers **dans des chaînes de caractères**. - nous avons vu comment **lire et écrire** des données de types divers
- Nous l'avons appliqué pour mieux séparer **fonctions qui calculent** et **fonctions d'entrées-sorties**. **dans des chaînes de caractères**.
- Enfin nous avons noté que l'on utilise la même syntaxe que pour lire et écrire dans un fichier ou - Nous l'avons appliqué pour mieux séparer **fonctions qui calculent**
pour interagir avec l'utilisateur. et **fonctions d'entrées-sorties**.
Cela est rendu possible par le concept de flux qui est le sujet de la [feuille suivante](cours-flux.md). - Enfin nous avons noté que, grâce au concept de flux, on peut
utiliser la même syntaxe que pour lire et écrire dans un fichier ou
pour interagir avec l'utilisateur.
...@@ -27,11 +27,11 @@ rise: ...@@ -27,11 +27,11 @@ rise:
+++ {"slideshow": {"slide_type": "note"}} +++ {"slideshow": {"slide_type": "note"}}
Avant de voir comment lire et écrire dans un fichier, nous avions vu Les semaines précédentes, nous avons vu comment afficher; c'est-à-dire
comment afficher; c'est-à-dire écrire à l'écran au moyen de écrire à l'écran au moyen de `cout`. Nous avons occasionnellement vu
`cout`. Nous avons occasionnellement vu comment lire depuis le clavier comment lire depuis le clavier avec `cin`. Nous allons maintenant
`cin`. Nous allons maintenant formaliser cela et introduire la notion formaliser cela et introduire la notion de flux qui nous servira
de flux. ensuite pour lire et écrire dans des fichiers.
+++ {"slideshow": {"slide_type": "slide"}} +++ {"slideshow": {"slide_type": "slide"}}
......