--- jupytext: text_representation: extension: .md format_name: myst format_version: 0.13 kernelspec: display_name: C++17 language: C++17 name: xcpp17 rise: auto_select: first autolaunch: false centered: false controls: false enable_chalkboard: true height: 100% margin: 0 maxScale: 1 minScale: 1 scroll: true slideNumber: true start_slideshow_at: selected transition: none width: 90% --- +++ {"slideshow": {"slide_type": "slide"}} # Fichiers, lecture, écriture +++ {"slideshow": {"slide_type": "fragment"}} ## Qu’est-ce qu’un fichier? Un **fichier informatique** est, au sens commun, une collection d’informations numériques réunies sous un même **nom**, enregistrées sur un support de stockage tel qu’un disque dur, un CD-ROM ou une bande magnétique, et manipulées comme une unité. Techniquement, un fichier est une **information numérique** constituée d'une **séquence d’octets**, c'est-à-dire d'une séquence de nombres, permettant des usages divers. +++ {"slideshow": {"slide_type": "fragment"}} En bref, c'est comme la mémoire, mais en **persistant**! De même que le type d'une variable indique comment l'information est encodée dans la mémoire, le **format du fichier** indique comment l’information y est encodée. +++ {"slideshow": {"slide_type": "fragment"}} Voyons maintenant comment on peut écrire et lire dans un fichier. +++ {"slideshow": {"slide_type": "slide"}} ## Écriture dans un fichier +++ {"slideshow": {"slide_type": "fragment"}} L'exemple suivant écrit `Noel 42` dans le fichier `bla.txt` : ```{code-cell} --- slideshow: slide_type: fragment --- #include <fstream> using namespace std; ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Déclaration ofstream flux; ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Ouverture flux.open("bla.txt"); ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Écriture flux << "Noël " << 42 << endl; ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Fermeture flux.close(); ``` +++ {"slideshow": {"slide_type": "slide"}} :::{admonition} À retenir Écrire dans un fichier se fait en **quatre étapes** : 1. Déclaration du flux 2. Ouverture du fichier 3. Écriture 4. Fermeture du fichier ::: +++ {"slideshow": {"slide_type": "slide"}} ## Lecture depuis un fichier +++ {"slideshow": {"slide_type": "fragment"}} Nous allons maintenant faire l'opération inverse : lire les informations stockées dans `bla.txt` : ```{code-cell} --- slideshow: slide_type: fragment --- #include <fstream> using namespace std; ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Déclaration ifstream flux; ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Ouverture du fichier flux.open("bla.txt"); ``` ```{code-cell} --- slideshow: slide_type: fragment --- string s; // Lecture flux >> s; s ``` ```{code-cell} --- slideshow: slide_type: fragment --- int i; flux >> i; i ``` ```{code-cell} --- slideshow: slide_type: fragment --- // Fermeture du fichier flux.close(); ``` +++ {"slideshow": {"slide_type": "slide"}} :::{admonition} À retenir :class: hint De même que l'écriture dans un fichier, la lecture se fait en **quatre étapes** : 1. Déclaration du flux 2. Ouverture du fichier 3. Lecture 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. :::