Les fichiers

4SI

Objectifs

À la fin de ce chapitre, l’élève doit être capable de :

  • définir un fichier et distinguer un fichier texte d’un fichier de données ;
  • déclarer, ouvrir, lire, écrire et fermer un fichier, en algorithmique et en Python ;
  • parcourir un fichier de façon séquentielle, du premier élément au dernier ;
  • ajouter, supprimer, modifier et trier le contenu d’un fichier ;
  • transférer des données d’un fichier texte vers un fichier de données, et inversement.

Plan du chapitre

  1. Introduction
  2. Notion de fichier
  3. Les fichiers texte
  4. Les fichiers de données
  5. Transferts entre fichiers
  6. Erreurs fréquentes
  7. Retenons

1. Introduction

Activité 1

Un professeur écrit un programme qui saisit les noms et les moyennes des élèves de sa classe, puis affiche la moyenne de la classe. Il saisit les trente élèves et obtient le résultat.

Le lendemain, un élève absent la veille lui remet sa note. Le professeur relance son programme pour l’ajouter.

Questions

  1. Que doit faire le professeur pour obtenir la nouvelle moyenne de la classe ?
  2. Pourquoi les données saisies la veille ne sont-elles plus disponibles ?
  3. Que faudrait-il pour éviter cette nouvelle saisie ?

Réponse

Le professeur doit ressaisir les trente élèves de la veille, puis le nouvel élève. Les données saisies la veille ont été placées dans la mémoire centrale de l’ordinateur pendant l’exécution du programme ; cette mémoire est volatile et son contenu a disparu à la fin de l’exécution.

Pour éviter cette nouvelle saisie, il faut enregistrer les données sur un support qui les conserve après la fin du programme : disque dur, clé USB ou espace de stockage en ligne. Sur ces supports, les données sont organisées en fichiers.

En détail

Toutes les structures de données étudiées jusqu’ici — variable simple, tableau, enregistrement — n’existent que pendant l’exécution du programme. Le fichier est la première structure dont l’existence dépasse la durée d’exécution.

2. Notion de fichier

2.1 Définition

Définition. Un fichier est un ensemble structuré de données, nommé et enregistré sur un support de stockage lisible par l’ordinateur.

On distingue deux types de fichiers :

  • le fichier texte, dont le contenu est une suite de caractères organisée en lignes, lisible par l’être humain ;
  • le fichier de données, dont le contenu est une suite d’objets de même type — entiers, réels ou enregistrements — enregistrés sous forme binaire.

Un fichier se distingue d’un tableau sur trois points : sa taille n’est pas fixée au moment de la déclaration, ses éléments n’ont pas d’indice, et son parcours se fait nécessairement du premier élément vers le dernier. Le tableau est une structure de traitement ; le fichier est une structure de conservation.

2.2 Nom logique et nom physique

Dans un programme, tout fichier possède deux noms.

  • Le nom physique est le chemin d’accès au fichier sur le support de stockage, par exemple "D:\eleves.dat".
  • Le nom logique est l’identificateur par lequel le programme désigne ce fichier, par exemple F.

La primitive Ouvrir établit la correspondance entre ces deux noms. Toutes les autres primitives — lecture, écriture, test de fin de fichier, fermeture — n’utilisent que le nom logique.

En détail

Certains ouvrages appellent le nom logique « nom interne » et le nom physique « nom externe ». Les deux appellations désignent la même chose.

2.3 Organisation d’un fichier

Un fichier texte est organisé en lignes successives. Un fichier de données est organisé en blocs successifs, chaque bloc contenant un objet, par exemple un enregistrement.

Type de fichierOrganisationUnité de lecture
Fichier textelignes de caractèresune ligne
Fichier de donnéesblocsun objet

Représentation d’un fichier texte. Chaque ligne se termine par le caractère de fin de ligne, représenté ici par le symbole ↵ : c’est le symbole de la touche Entrée du clavier, et c’est en appuyant sur cette touche que l’on crée ce caractère. Il ne s’affiche jamais à l’écran, et il ne s’écrit jamais dans un algorithme.

11223344#Bacha Sarra#18.75↵
10556677#Ben Saleh Omar#17.25↵
12889900#Mekki Mohamed Amine#16.75↵
…

Représentation d’un fichier de données. Chaque bloc contient un enregistrement, avec tous ses champs.

Remarque importante. Cette représentation est un schéma. Le contenu réel d’un fichier de données n’est pas lisible : le schéma montre sa structure, et non ce que l’on verrait en ouvrant le fichier dans un éditeur de texte.

Dans les deux cas, les éléments sont placés les uns à la suite des autres, et l’accès se fait de façon séquentielle : pour atteindre un élément, il faut avoir lu tous ceux qui le précèdent.

2.4 La position courante

Le système retient en permanence l’endroit du fichier où en est la lecture ou l’écriture. Cette marque est appelée le pointeur du fichier.

À l’ouverture, le pointeur est placé au début du fichier en mode lecture ou en mode création, et à la fin du fichier en mode ajout. Chaque lecture et chaque écriture le font avancer d’elles-mêmes, jusqu’à l’élément suivant.

Après l’ouverture en lecture : le pointeur est placé sur le premier bloc.

Après deux lectures : le pointeur est placé sur le troisième bloc. Les deux premiers ont été lus et ne peuvent plus être atteints.

Après la lecture du dernier bloc : le pointeur est placé après la fin du fichier. C’est dans cette position que la fonction Fin_fichier retourne Vrai.

Remarque importante. Aucune instruction ne permet de déplacer directement le pointeur. C’est la raison pour laquelle un fichier se parcourt toujours du début vers la fin, sans retour en arrière.

En détail

Cette propriété a une conséquence qui traverse tout le chapitre : dès qu’un traitement exige de revenir en arrière — trier, insérer au milieu, supprimer —, on ne peut pas le faire directement sur le fichier. On verra au paragraphe 4.7 comment on procède.

3. Les fichiers texte

3.1 Définition

Définition. Un fichier texte est une suite de caractères organisée en lignes. Chaque ligne se termine par un caractère de fin de ligne qui ne s’affiche pas à l’écran, mais qui est bien enregistré dans le fichier.

C’est ce caractère de fin de ligne qui sépare deux lignes. Une écriture qui ne le place pas laisse la ligne ouverte : le texte écrit ensuite vient se placer à sa suite, sur la même ligne.

Un fichier texte peut être ouvert et lu avec un simple éditeur de texte, comme le Bloc-notes.

Exemple. Le fichier eleves.txt contient la liste d’une classe, à raison d’une ligne par élève. Chaque ligne contient le numéro de la carte d’identité, le nom et la moyenne de l’élève, séparés par le caractère #.

11223344#Bacha Sarra#18.75
10556677#Ben Saleh Omar#17.25
12889900#Mekki Mohamed Amine#16.75
11334455#Baccara Lina#15.75
10998877#Ragued Kaslen#8.5

Ce fichier sert d’exemple dans toute la partie consacrée aux fichiers texte.

3.2 Déclaration

Le type Fichier texte est un type prédéfini : il ne nécessite aucune déclaration dans le tableau de déclaration des nouveaux types.

Tableau de déclaration des objets

ObjetType / Nature
nom_logiqueFichier texte

Exemple

ObjetType / Nature
FFichier texte

3.3 Ouverture et fermeture

Ouverture

Syntaxe algorithmique

Ouvrir(nom_physique, nom_logique, mode)

Le paramètre mode est une chaîne de caractères qui précise l’usage du fichier.

ModeUsagePosition du pointeurEffet sur un fichier existant
"r"lecturedébut du fichierle fichier doit exister
"w"création, écrituredébut du fichierle contenu est entièrement effacé
"a"ajoutfin du fichierle contenu est conservé

Exemple

Ouvrir("D:\eleves.txt", F1, "r")
Ouvrir("D:\admis.txt", F2, "w")
Ouvrir("D:\eleves.txt", F3, "a")

Remarque importante. L’effacement provoqué par le mode "w" est immédiat : il se produit à l’ouverture, avant toute écriture. Un fichier de cent lignes ouvert en mode "w" puis refermé sans qu’aucune écriture n’ait eu lieu devient un fichier vide.

En détail

On en déduit une règle de choix. Le mode "w" s’emploie pour créer un fichier ou pour le reconstruire entièrement ; il ne s’emploie jamais pour le compléter. Le mode "a" s’emploie pour compléter un fichier existant sans rien perdre de son contenu.

Fermeture

Syntaxe algorithmique

Fermer(nom_logique)

Tant qu’un fichier n’a pas été fermé, l’enregistrement effectif de son contenu sur le support n’est pas garanti.

En détail

Un même fichier ne doit pas être ouvert deux fois en même temps. Lorsqu’un traitement exige de lire un fichier puis de le réécrire, on le ferme avant de le rouvrir dans le nouveau mode.

En Python

nom_logique = open(nom_physique, mode)
nom_logique.close()

Les modes "r", "w" et "a" ont le même effet qu’en algorithmique.

F1 = open("D:/eleves.txt", "r")
F1.close()

3.4 Lecture

Syntaxe algorithmique

Lire_ligne(nom_logique, ch) lit la ligne courante et la range dans la chaîne ch.

Lire(nom_logique, ch) lit la totalité du fichier et la range dans la chaîne ch.

Après la lecture d’une ligne, le pointeur passe au début de la ligne suivante. La chaîne obtenue ne contient pas le caractère de fin de ligne.

Exemple. Après Ouvrir("D:\eleves.txt", F, "r"), l’instruction Lire_ligne(F, ch) range dans ch la chaîne "11223344#Bacha Sarra#18.75". Une seconde instruction Lire_ligne(F, ch) y range "10556677#Ben Saleh Omar#17.25".

En Python

AlgorithmiquePython
Lire_ligne(F, ch)ch = F.readline()
Lire(F, ch)ch = F.read()

Remarque importante. En Python, readline() rend la ligne avec son caractère de fin de ligne "\n". On le retire par ch = ch[:len(ch) - 1]. Cette opération est propre à Python : elle n’a pas d’équivalent à écrire en algorithmique. Elle suppose que chaque ligne, y compris la dernière, se termine par "\n" : c’est le cas des fichiers écrits par un programme avec F.write(ch + "\n"). Si la dernière ligne n’a pas de fin de ligne, son dernier caractère serait perdu.

3.5 Écriture

Syntaxe algorithmique

Écrire(nom_logique, ch) écrit la chaîne ch sans passer à la ligne.

Écrire_nl(nom_logique, ch) écrit la chaîne ch puis le caractère de fin de ligne.

Exemple

Ouvrir("D:\admis.txt", F, "w")
Écrire_nl(F, "11223344#Bacha Sarra#18.75")
Écrire_nl(F, "10556677#Ben Saleh Omar#17.25")
Fermer(F)

Le fichier admis.txt contient alors deux lignes.

Remarque importante. Les primitives Écrire et Écrire_nl d’un fichier texte reçoivent une chaîne de caractères. Pour écrire une valeur numérique, on la convertit d’abord à l’aide de la fonction Convch.

En Python

AlgorithmiquePython
Écrire(F, ch)F.write(ch)
Écrire_nl(F, ch)F.write(ch + "\n")

3.6 Test de fin de fichier

Syntaxe algorithmique

Fin_fichier(nom_logique) est une fonction qui retourne Vrai si le pointeur est à la fin du fichier, et Faux sinon.

La fonction Fin_fichier teste la position du pointeur avant toute lecture.

En Python

Python ne dispose pas d’une fonction équivalente pour les fichiers texte. On lit d’abord, puis on teste la valeur lue : la méthode readline() rend la chaîne vide "" lorsqu’il n’y a plus rien à lire.

3.7 Parcours d’un fichier texte

Pour traiter toutes les lignes d’un fichier dont on ne connaît pas le nombre, on répète la lecture tant que la fin du fichier n’est pas atteinte.

Ouvrir(nom_physique, F, "r")
Tant que Non(Fin_fichier(F)) Faire
    Lire_ligne(F, ch)
    // traitement de la ligne ch
Fin Tant que
Fermer(F)

Trois règles s’appliquent à ce parcours :

  • la lecture se place à l’intérieur de la boucle ;
  • aucune lecture n’est faite avant la boucle, puisque Fin_fichier répond sans lire ;
  • aucune variable booléenne n’est nécessaire pour détecter la fin du fichier : c’est le rôle de Fin_fichier.

Choix de la structure répétitive

SituationStructure
Nombre de lignes connuPour i de 0 à n - 1 Faire ou Pour i de 1 à n Faire
Nombre de lignes inconnuTant que Non(Fin_fichier(F)) Faire

En détail

Lorsque le nombre de lignes est connu, les deux formes de la boucle Pour sont correctes. Dans un tableau, la variable i est un indice et commence obligatoirement à 0. Dans un fichier, elle ne sert qu’à compter les répétitions : elle n’indexe aucun élément.

Application : afficher la liste de la classe

Procédure Afficher_Liste (nomF : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "r")
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        Écrire(ch)
    Fin Tant que
    Fermer(F)
FIN

TDOL

ObjetType / Nature
FFichier texte
chChaîne de caractères

En Python

La traduction Python n’a pas la même forme, puisque Python lit avant de tester :

def Afficher_Liste(nomF):
    F = open(nomF, "r")
    ch = F.readline()
    while ch != "":
        ch = ch[:len(ch) - 1]
        print(ch)
        ch = F.readline()
    F.close()

Remarque importante. La forme Python est une traduction de l’algorithme, pas son modèle. En algorithmique, on n’écrit ni lecture avant la boucle, ni retrait du caractère de fin de ligne.

3.8 Découper une ligne

Une ligne d’un fichier texte est une seule chaîne de caractères. Lorsqu’elle contient plusieurs informations séparées par un caractère, il faut les extraire à l’aide des fonctions prédéfinies sur les chaînes : Pos, Sous_chaine, Long et Valeur.

Exemple. Soit ch = "11223344#Bacha Sarra#18.75". Les positions commencent à 0.

InstructionRésultat
p ← Pos("#", ch)8
cin ← Sous_chaine(ch, 0, p)"11223344"
reste ← Sous_chaine(ch, p + 1, Long(ch))"Bacha Sarra#18.75"
p ← Pos("#", reste)11
nom ← Sous_chaine(reste, 0, p)"Bacha Sarra"
moy ← Valeur(Sous_chaine(reste, p + 1, Long(reste)))18.75

Lorsque la ligne contient deux séparateurs, on procède en deux temps : on extrait le premier champ, on garde le reste de la ligne, et l’on recommence sur ce reste.

Remarque importante. La borne de fin de Sous_chaine est exclue. Pour prendre la chaîne jusqu’à son dernier caractère, la borne est Long(ch), et non Long(ch) - 1.

Application : la moyenne de la classe

Fonction Moyenne_Texte (nomF : Chaîne de caractères) : Réel
DEBUT
    Ouvrir(nomF, F, "r")
    s ← 0
    nb ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        p ← Pos("#", ch)
        reste ← Sous_chaine(ch, p + 1, Long(ch))
        p ← Pos("#", reste)
        s ← s + Valeur(Sous_chaine(reste, p + 1, Long(reste)))
        nb ← nb + 1
    Fin Tant que
    Fermer(F)
    Si nb = 0 Alors
        m ← 0
    Sinon
        m ← s / nb
    FinSi
    Retourner m
FIN

TDOL

ObjetType / Nature
FFichier texte
ch, resteChaîne de caractères
p, nbEntier
s, mRéel

Sur le fichier eleves.txt du paragraphe 3.1, cette fonction retourne 15.4.

En détail

Le test nb = 0 n’est pas une précaution superflue : sur un fichier vide, le calcul s / nb serait une division par zéro. La fonction retourne alors 0.

On remarquera le coût de ce calcul : pour chaque ligne, deux recherches de séparateur, deux extractions et une conversion, uniquement pour obtenir la moyenne. La partie 4 montre comment l’éviter.

Application 1 — Répertoire

Le fichier texte "repertoire.txt" contient une liste de contacts, à raison d’un contact par ligne, sous la forme Prénom:téléphone.

Adam:98700800
Chaima:28999777
Ghaith:22000000
Souhaila:41568987
Takwa:52525252
Yasser:22999888
Manar:51114441
Mariem:21213232
Nawres:98123546
Nour:50900900
Louay:51800900

Travail demandé

  1. Écrire l’algorithme de la procédure Ajouter_Fin(nomF, c, t) qui ajoute le contact de prénom c et de téléphone t à la fin du fichier.
  2. Écrire l’algorithme de la procédure Ajouter_Debut(nomF, c, t) qui ajoute ce même contact au début du fichier.
  3. Écrire l’algorithme de la procédure Supprimer(nomF, c) qui supprime du répertoire le contact de prénom c.
  4. Écrire l’algorithme de la procédure Modifier(nomF, c, nt) qui remplace par nt le numéro de téléphone du contact de prénom c.
  5. Écrire l’algorithme de la procédure Trier(nomF) qui trie les contacts dans l’ordre croissant des prénoms.

N.B. nomF est une chaîne de caractères contenant l’emplacement et le nom physique du fichier. Le répertoire contient au plus 200 contacts. Aucun prénom ne contient le caractère :.

Voir le corrigé

1. Ajouter_Fin

Le mode "a" place le pointeur à la fin du fichier existant. Il n’est pas nécessaire de lire le fichier.

Procédure Ajouter_Fin (nomF, c, t : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "a")
    Écrire_nl(F, c + ":" + t)
    Fermer(F)
FIN

TDOL

ObjetType / Nature
FFichier texte

En détail

Les paramètres formels nomF, c et t ne figurent pas au tableau de déclaration des objets locaux. La ligne est recomposée avant l’écriture : le fichier ne contient que des chaînes entières.

2. Ajouter_Debut

Aucun mode d’ouverture ne permet d’écrire au début d’un fichier sans l’effacer. On procède donc en trois temps : on charge toutes les lignes dans un tableau, on réécrit le fichier en commençant par le nouveau contact, puis on réécrit les lignes chargées.

Procédure Ajouter_Debut (nomF, c, t : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "r")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        T[n] ← ch
        n ← n + 1
    Fin Tant que
    Fermer(F)
    Ouvrir(nomF, F, "w")
    Écrire_nl(F, c + ":" + t)
    Pour i de 0 à n - 1 Faire
        Écrire_nl(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local

Nouveau type
TabL = Tableau de 200 Chaînes de caractères

TDOL

ObjetType / Nature
FFichier texte
TTabL
chChaîne de caractères
n, iEntier

Schéma de la reconstruction

repertoire.txt — ouvert en "r"T — en mémoirerepertoire.txt — ouvert en "w"
Aya:55667788
Adam:98700800T[0] Adam:98700800Adam:98700800
Chaima:28999777T[1] Chaima:28999777Chaima:28999777
Ghaith:22000000T[2] Ghaith:22000000Ghaith:22000000
………

Remarque importante. La fermeture du fichier entre les deux ouvertures est indispensable : le mode "w" efface le contenu, c’est-à-dire exactement ce qui vient d’être lu.

En détail

Dans la dernière boucle, T est un tableau : la variable i est un indice et commence à 0. Ce n’est pas la même situation que dans le parcours d’un fichier.

3. Supprimer

Même démarche : seules les lignes dont le prénom est différent de c sont conservées dans le tableau.

Procédure Supprimer (nomF, c : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "r")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        p ← Pos(":", ch)
        Si Sous_chaine(ch, 0, p) ≠ c Alors
            T[n] ← ch
            n ← n + 1
        FinSi
    Fin Tant que
    Fermer(F)
    Ouvrir(nomF, F, "w")
    Pour i de 0 à n - 1 Faire
        Écrire_nl(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local — TabL = Tableau de 200 Chaînes de caractères

TDOL

ObjetType / Nature
FFichier texte
TTabL
chChaîne de caractères
n, i, pEntier

En détail

La variable n compte les lignes conservées, et non les lignes lues : son incrémentation se trouve à l’intérieur du Si. C’est n, et non la taille du tableau, qui limite la réécriture.

On compare le prénom extrait de la ligne, et non la ligne entière : "Takwa" est différent de "Takwa:52525252".

4. Modifier

Toutes les lignes sont conservées ; la ligne du contact concerné est remplacée par une nouvelle ligne.

Procédure Modifier (nomF, c, nt : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "r")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        p ← Pos(":", ch)
        Si Sous_chaine(ch, 0, p) = c Alors
            T[n] ← c + ":" + nt
        Sinon
            T[n] ← ch
        FinSi
        n ← n + 1
    Fin Tant que
    Fermer(F)
    Ouvrir(nomF, F, "w")
    Pour i de 0 à n - 1 Faire
        Écrire_nl(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local — TabL = Tableau de 200 Chaînes de caractères

TDOL

ObjetType / Nature
FFichier texte
TTabL
chChaîne de caractères
n, i, pEntier

En détail

Comparée à Supprimer, cette procédure ne diffère que par une instruction : l’incrémentation n ← n + 1 se trouve ici en dehors du Si, puisque aucune ligne n’est écartée.

5. Trier

On charge les lignes dans un tableau, on trie le tableau par insertion selon le prénom, puis on réécrit le fichier.

Procédure Trier (nomF : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "r")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire_ligne(F, ch)
        T[n] ← ch
        n ← n + 1
    Fin Tant que
    Fermer(F)
    Pour i de 1 à n - 1 Faire
        aux ← T[i]
        j ← i
        Tant que (j > 0) Et (Prenom(T[j-1]) > Prenom(aux)) Faire
            T[j] ← T[j-1]
            j ← j - 1
        Fin Tant que
        T[j] ← aux
    Fin Pour
    Ouvrir(nomF, F, "w")
    Pour i de 0 à n - 1 Faire
        Écrire_nl(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local — TabL = Tableau de 200 Chaînes de caractères

TDOL

ObjetType / Nature
FFichier texte
TTabL
ch, auxChaîne de caractères
n, i, jEntier
PrenomFonction
Fonction Prenom (ch : Chaîne de caractères) : Chaîne de caractères
DEBUT
    Retourner Sous_chaine(ch, 0, Pos(":", ch))
FIN

En détail

La fonction Prenom n’a ni variable locale ni module appelé : conformément aux conventions, elle n’a pas de TDOL. Son absence n’est pas un oubli.

Remarque importante. Le tri porte sur le tableau, jamais sur le fichier.

En détail

Le critère de tri est le prénom seul, extrait de chaque ligne. Comparer les lignes entières donne le plus souvent le même ordre, puisque le caractère : est placé avant toutes les lettres ; mais un prénom composé change le résultat : la ligne "Mohamed Amine:…" serait placée avant "Mohamed:…", parce que l’espace est placé avant :.

Après le tri, le répertoire contient les prénoms dans l’ordre : Adam, Chaima, Ghaith, Louay, Manar, Mariem, Nawres, Nour, Souhaila, Takwa, Yasser.

4. Les fichiers de données

Activité 2

On reprend la fonction Moyenne_Texte du paragraphe 3.8.

Questions

  1. Combien d’opérations de découpage et de conversion faut-il effectuer pour chaque ligne du fichier, uniquement pour obtenir la moyenne de l’élève ?
  2. Si le fichier contenait dix champs par élève, comment évoluerait ce travail ?
  3. Quelle forme devraient avoir les données enregistrées pour que chaque élève soit lu en une seule opération, avec ses champs déjà séparés et déjà du bon type ?

Réponse

Pour chaque ligne, il faut deux recherches du séparateur, deux extractions et une conversion de la chaîne obtenue en nombre. Avec dix champs, ce travail serait multiplié d’autant, et chaque programme qui utilise le fichier devrait le refaire.

Il faudrait que chaque élève soit enregistré sous la forme d’un enregistrement, avec ses trois champs déjà typés. C’est ce que permet le fichier de données.

4.1 Définition

Définition. Un fichier de données est une suite d’objets de même type — entiers, réels ou, le plus souvent, enregistrements — enregistrés sous forme binaire.

Son contenu n’est pas lisible dans un éditeur de texte. Il porte habituellement l’extension .dat et se manipule en mode binaire.

Un objet lu dans un fichier de données est obtenu en une seule opération, avec ses champs déjà séparés et déjà typés.

Exemple. Le fichier eleves.dat, qui contient les mêmes élèves que le fichier eleves.txt du paragraphe 3.1, se représente ainsi :

Chaque bloc est un enregistrement de type Eleve. Une instruction Lire(F, E) range un bloc entier dans la variable E.

En détail

Le programme officiel parle de « fichier de données ». Le mot « binaire » qualifie la forme sous laquelle les objets sont enregistrés ; c’est pourquoi les modes d’ouverture de ces fichiers se terminent par la lettre b : "rb", "wb", "ab".

4.2 Déclaration

Un fichier de données se déclare dans le tableau de déclaration des nouveaux types. Lorsque ses éléments sont des enregistrements, la déclaration se fait en deux temps : on déclare d’abord le type enregistrement, puis le type fichier qui le contient.

Syntaxe — tableau de déclaration des nouveaux types

nom_type = Fichier de type_éléments

Exemple. Le fichier eleves.dat contient un enregistrement par élève.

TDNT

Nouveau type
Eleve = Enregistrement
CIN : Chaîne de caractères
Nom : Chaîne de caractères
Moyenne : Réel
Fin
Feleve = Fichier de Eleve

TDO

ObjetType / Nature
FFeleve
EEleve

Lorsque ses éléments sont d’un type prédéfini — entier, réel, caractère —, une seule déclaration suffit : Freel = Fichier de Réel.

Remarque importante. Un type se déclare avant d’être utilisé : le tableau de déclaration des nouveaux types précède toujours le tableau de déclaration des objets.

En détail

Le champ CIN est déclaré comme une chaîne de caractères, et non comme un entier. Un numéro de carte d’identité est un identifiant, sur lequel on ne fait aucun calcul ; déclaré comme entier, un numéro commençant par 0 perdrait ce premier chiffre.

4.3 Ouverture et fermeture

Syntaxe algorithmique

Ouvrir(nom_physique, nom_logique, mode)

Fermer(nom_logique)

ModeUsagePosition du pointeurEffet sur un fichier existant
"rb"lecturedébut du fichierle fichier doit exister
"wb"création, écrituredébut du fichierle contenu est entièrement effacé
"ab"ajoutfin du fichierle contenu est conservé

Ce sont les trois modes du fichier texte, suivis de la lettre b. Leur effet est le même, y compris l’effacement provoqué par "wb".

En Python

F = open("D:/eleves.dat", "rb")
F.close()

4.4 Lecture et écriture

Syntaxe algorithmique

Lire(nom_logique, objet) lit l’objet courant du fichier et le range dans la variable objet.

Écrire(nom_logique, objet) écrit le contenu de la variable objet dans le fichier.

Exemple

E.CIN ← "11223344"
E.Nom ← "Bacha Sarra"
E.Moyenne ← 18.75
Ouvrir("D:\eleves.dat", F, "wb")
Écrire(F, E)
Fermer(F)

Remarque importante. Le nom logique du fichier est toujours le premier paramètre : on écrit Écrire(F, E), jamais Écrire(E, F).

Les objets se lisent dans l’ordre où ils ont été écrits. La variable de lecture doit être du même type que les éléments du fichier.

En Python

La lecture et l’écriture utilisent le module pickle.

AlgorithmiquePython
Lire(F, E)E = load(F)
Écrire(F, E)dump(E, F)
from pickle import load, dump

Remarque importante. L’ordre des paramètres s’inverse d’un langage à l’autre : Écrire(F, E) se traduit par dump(E, F).

En Python, un enregistrement est représenté par un dictionnaire : le champ E.Moyenne s’écrit E['Moyenne'].

4.5 Test de fin de fichier

La fonction Fin_fichier(nom_logique) s’emploie de la même façon que pour un fichier texte.

En Python

Le module pickle n’offre aucun test de fin de fichier : la fonction load provoque une erreur lorsqu’il n’y a plus d’objet à lire. On intercepte cette erreur à l’aide de la structure try / except.

fin = False
while not (fin):
    try:
        E = load(F)
        # traitement de E
    except:
        fin = True

Remarque importante. Le traitement se place à l’intérieur du bloc try, juste après load. Placé après le bloc except, il serait exécuté une fois de trop, sur un objet qui n’a pas été lu.

En détail

La variable fin est une nécessité propre à Python. En algorithmique, aucune variable de ce genre n’apparaît : Fin_fichier est une fonction prédéfinie.

4.6 Parcours d’un fichier de données

Le parcours d’un fichier de données a exactement la même structure que celui d’un fichier texte : Lire remplace Lire_ligne, et le mode "rb" remplace le mode "r".

Remarque importante. Sur un fichier texte, Lire(F, ch) rend le fichier entier en une seule opération. Sur un fichier de données, Lire(F, E) ne rend qu’un seul objet : aucune primitive ne lit la totalité du fichier en une fois. Pour traiter tous les objets, le parcours est obligatoire.

Ouvrir(nom_physique, F, "rb")
Tant que Non(Fin_fichier(F)) Faire
    Lire(F, E)
    // traitement de E
Fin Tant que
Fermer(F)

Application : la moyenne de la classe

Fonction Moyenne_Classe (nomF : Chaîne de caractères) : Réel
DEBUT
    Ouvrir(nomF, F, "rb")
    s ← 0
    nb ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire(F, E)
        s ← s + E.Moyenne
        nb ← nb + 1
    Fin Tant que
    Fermer(F)
    Si nb = 0 Alors
        m ← 0
    Sinon
        m ← s / nb
    FinSi
    Retourner m
FIN

TDOL

ObjetType / Nature
FFeleve
EEleve
nbEntier
s, mRéel

Sur un fichier eleves.dat contenant les cinq élèves du paragraphe 3.1, cette fonction retourne 15.4, comme Moyenne_Texte.

En détail

On comparera cette fonction à Moyenne_Texte (paragraphe 3.8). Le résultat est le même, mais la ligne s ← s + E.Moyenne remplace à elle seule la recherche des séparateurs, les extractions et la conversion : le champ Moyenne est déjà un réel.

En Python

from pickle import load

def Moyenne_Classe(nomF):
    F = open(nomF, "rb")
    s = 0
    nb = 0
    fin = False
    while not (fin):
        try:
            E = load(F)
            s = s + E['Moyenne']
            nb = nb + 1
        except:
            fin = True
    F.close()
    if nb == 0:
        m = 0
    else:
        m = s / nb
    return m

4.7 Modifier un fichier : trois traitements

Le pointeur d’un fichier ne peut qu’avancer (paragraphe 2.4). Il en résulte qu’un fichier ne se modifie pas en place : on ne peut ni remplacer un élément situé au milieu du fichier, ni le supprimer. Trois traitements sont possibles.

TraitementModePrincipeUsage
Parcours"rb"on lit, on ne modifie riencompter, chercher, afficher, calculer
Ajout"ab"on écrit à la fin, le reste est conservéajouter un élément
Reconstruction"rb" puis "wb"on charge tout, on traite, on réécrit toutsupprimer, modifier, insérer, trier

Remarque importante. L’ajout est la seule modification qui ne réécrit pas le fichier. Toutes les autres passent par une reconstruction complète.

Les mêmes traitements s’appliquent aux fichiers texte, avec les modes "r", "a" et "w" : l’application 1 en a donné les exemples.

Rechercher un élève

Fonction Existe (nomF, c : Chaîne de caractères) : Booléen
DEBUT
    Ouvrir(nomF, F, "rb")
    trouve ← Faux
    Tant que Non(Fin_fichier(F)) Et Non(trouve) Faire
        Lire(F, E)
        Si E.CIN = c Alors
            trouve ← Vrai
        FinSi
    Fin Tant que
    Fermer(F)
    Retourner trouve
FIN

TDOL

ObjetType / Nature
FFeleve
EEleve
trouveBooléen

La lecture s’arrête dès que l’élève est trouvé. La variable trouve mémorise le succès de la recherche ; elle ne remplace pas Fin_fichier, qui continue de détecter la fin du fichier.

Ajouter un élève

Procédure Ajouter_Eleve (nomF : Chaîne de caractères, E : Eleve)
DEBUT
    Si Existe(nomF, E.CIN) Alors
        Écrire("Cet élève figure déjà dans le fichier.")
    Sinon
        Ouvrir(nomF, F, "ab")
        Écrire(F, E)
        Fermer(F)
    FinSi
FIN

TDOL

ObjetType / Nature
FFeleve
ExisteFonction

En détail

Les deux ouvertures sont successives, et non imbriquées : Existe ouvre le fichier, le lit, puis le ferme ; ce n’est qu’ensuite que Ajouter_Eleve le rouvre en mode "ab".

Le tableau de déclaration des objets locaux contient les variables locales et les modules appelés.

Supprimer un élève

Procédure Supprimer_Eleve (nomF, c : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "rb")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire(F, E)
        Si E.CIN ≠ c Alors
            T[n] ← E
            n ← n + 1
        FinSi
    Fin Tant que
    Fermer(F)
    Ouvrir(nomF, F, "wb")
    Pour i de 0 à n - 1 Faire
        Écrire(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local — TabE = Tableau de 40 Eleve

TDOL

ObjetType / Nature
FFeleve
TTabE
EEleve
n, iEntier

Schéma de la reconstruction — suppression de l’élève de CIN 12889900

eleves.dat — ouvert en "rb"T — en mémoireeleves.dat — ouvert en "wb"
Bacha SarraT[0] Bacha SarraBacha Sarra
Ben Saleh OmarT[1] Ben Saleh OmarBen Saleh Omar
Mekki Mohamed AmineécartéBaccara Lina
Baccara LinaT[2] Baccara LinaRagued Kaslen
Ragued KaslenT[3] Ragued Kaslen

4.8 Relire ou charger ?

Face à un traitement demandé, la question à se poser est la suivante : un seul passage dans l’ordre du fichier suffit-il ?

Traitement demandéTechnique
Compter, chercher, filtrer, cumuler, chercher le maximum ou le minimumOn relit le fichier : un seul passage suffit
Trier, insérer, supprimer, modifierOn charge le fichier dans un tableau d’enregistrements, on traite le tableau, puis on réécrit le fichier

Le chargement a toujours la même forme :

Ouvrir(nomF, F, "rb")
n ← 0
Tant que Non(Fin_fichier(F)) Faire
    Lire(F, E)
    T[n] ← E
    n ← n + 1
Fin Tant que
Fermer(F)

Remarque importante. Il faut distinguer la taille déclarée du tableau — 40 pour le type TabE du paragraphe 4.7 — et sa taille effective n, qui est le nombre d’éléments réellement chargés depuis le fichier. Tous les traitements qui suivent portent sur les éléments d’indice 0 à n - 1, jamais sur la taille déclarée.

5. Transferts entre fichiers

5.1 Du fichier texte au fichier de données

Exemple. On veut créer le fichier eleves.dat à partir du fichier eleves.txt du paragraphe 3.1. Chaque ligne est découpée selon la méthode du paragraphe 3.8, et les champs obtenus sont rangés dans un enregistrement, qui est écrit dans le fichier de données.

Procédure Transferer (nomT, nomD : Chaîne de caractères)
DEBUT
    Ouvrir(nomT, Ft, "r")
    Ouvrir(nomD, Fd, "wb")
    Tant que Non(Fin_fichier(Ft)) Faire
        Lire_ligne(Ft, ch)
        p ← Pos("#", ch)
        E.CIN ← Sous_chaine(ch, 0, p)
        reste ← Sous_chaine(ch, p + 1, Long(ch))
        p ← Pos("#", reste)
        E.Nom ← Sous_chaine(reste, 0, p)
        E.Moyenne ← Valeur(Sous_chaine(reste, p + 1, Long(reste)))
        Écrire(Fd, E)
    Fin Tant que
    Fermer(Ft)
    Fermer(Fd)
FIN

TDOL

ObjetType / Nature
FtFichier texte
FdFeleve
EEleve
ch, resteChaîne de caractères
pEntier

En détail

Quatre points sont à respecter : deux fichiers sont ouverts, il faut donc deux fermetures ; le fichier créé s’ouvre en mode "wb" ; les champs sont préfixés par le nom de l’enregistrement, E.Nom et non Nom ; le nom logique du fichier est le premier paramètre de Écrire.

Seul le champ Moyenne nécessite une conversion par Valeur, puisque CIN et Nom sont des chaînes de caractères.

5.2 Du fichier de données au fichier texte

Exemple. On veut enregistrer dans le fichier texte admis.txt les élèves du fichier eleves.dat dont la moyenne est supérieure ou égale à 10, à raison d’une ligne par élève, sous la forme CIN#Nom#Moyenne.

Procédure Exporter_Admis (nomD, nomT : Chaîne de caractères)
DEBUT
    Ouvrir(nomD, Fd, "rb")
    Ouvrir(nomT, Ft, "w")
    Tant que Non(Fin_fichier(Fd)) Faire
        Lire(Fd, E)
        Si E.Moyenne ≥ 10 Alors
            Écrire_nl(Ft, E.CIN + "#" + E.Nom + "#" + Convch(E.Moyenne))
        FinSi
    Fin Tant que
    Fermer(Fd)
    Fermer(Ft)
FIN

TDOL

ObjetType / Nature
FdFeleve
FtFichier texte
EEleve

Le fichier admis.txt obtenu contient quatre lignes :

11223344#Bacha Sarra#18.75
10556677#Ben Saleh Omar#17.25
12889900#Mekki Mohamed Amine#16.75
11334455#Baccara Lina#15.75

Remarque importante. La concaténation par + ne s’applique qu’à des chaînes : le champ réel Moyenne est converti par Convch avant d’être concaténé.

En détail

Deux fichiers différents sont ouverts en même temps, ce qui est permis. Ce qui est interdit, c’est d’ouvrir le même fichier deux fois simultanément.

Application 2 — Compétition

Afin d’automatiser la gestion des résultats d’une compétition EA Sports de l’année 2027, on utilise le fichier de données "FiFa2027.dat", enregistré sur le disque D, qui contient les joueurs d’une poule. Une poule compte de 8 à 32 joueurs. Chaque joueur est décrit par :

  • Code : une chaîne de caractères formée d’une lettre majuscule suivie de 9 chiffres ;
  • Score : un entier positif ou nul.

Exemple — début du fichier FiFa2027.dat :

On donne les déclarations suivantes :

Nouveau type
Joueur = Enregistrement
Code : Chaîne de caractères
Score : Entier
Fin
FichJoueur = Fichier de Joueur

Travail demandé

  1. Écrire l’algorithme de la procédure Remplir(nomF, n) qui crée le fichier et y saisit les n joueurs de la poule. Le code et le score sont contrôlés à la saisie.
  2. Écrire l’algorithme de la procédure Ajouter(nomF) qui saisit un joueur supplémentaire et l’ajoute à la fin du fichier, à condition que la poule ne soit pas complète (32 joueurs) et que son code n’y figure pas déjà ; dans le cas contraire, elle affiche un message qui en donne la raison.
  3. Écrire l’algorithme de la procédure Trier(nomF) qui trie les joueurs dans l’ordre décroissant du score. À score égal, les joueurs sont départagés par ordre croissant de leur code.
  4. Écrire l’algorithme de la procédure Classement(nomF, nomFt) qui enregistre dans le fichier texte nomFt le classement des joueurs, à raison d’une ligne par joueur, sous la forme rang) Code : Score.
  5. Écrire l’algorithme du programme principal, qui saisit le nombre de joueurs de la poule et appelle les modules dans l’ordre utile.

N.B. nomF et nomFt sont des chaînes de caractères contenant l’emplacement et le nom physique des fichiers.

Voir le corrigé

5. Programme principal

ALGORITHME Competition
DEBUT
    Répéter
        Écrire("Nombre de joueurs de la poule : "), Lire(n)
    Jusqu'à (n ≥ 8) Et (n ≤ 32)
    nomf ← "D:\FiFa2027.dat"
    Remplir(nomf, n)
    Ajouter(nomf)
    Trier(nomf)
    Classement(nomf, "D:\Classement.txt")
FIN

TDNT

Nouveau type
Joueur = Enregistrement
Code : Chaîne de caractères
Score : Entier
Fin
FichJoueur = Fichier de Joueur

TDOG

ObjetType / Nature
nEntier
nomfChaîne de caractères
RemplirProcédure
AjouterProcédure
TrierProcédure
ClassementProcédure

En détail

Le nom physique est rangé une seule fois dans la variable nomf : si le fichier change d’emplacement, une seule ligne est à modifier.

Les bornes 8 et 32 du contrôle de saisie sont celles que donne l’énoncé pour une poule.

L’ordre des appels n’est pas libre : on ne trie pas un fichier qui n’a pas été créé, et l’on n’enregistre le classement qu’après le tri.

1. Remplir

Procédure Remplir (nomF : Chaîne de caractères, n : Entier)
DEBUT
    Ouvrir(nomF, F, "wb")
    Pour i de 0 à n - 1 Faire
        Répéter
            Écrire("Code du joueur ", i + 1, " : "), Lire(E.Code)
        Jusqu'à Valide(E.Code)
        Répéter
            Écrire("Score : "), Lire(E.Score)
        Jusqu'à E.Score ≥ 0
        Écrire(F, E)
    Fin Pour
    Fermer(F)
FIN

TDOL

ObjetType / Nature
FFichJoueur
EJoueur
iEntier
ValideFonction
Fonction Valide (ch : Chaîne de caractères) : Booléen
DEBUT
    Retourner (Long(ch) = 10) Et (ch[0] ∈ ["A".."Z"])
              Et Estnum(Sous_chaine(ch, 1, Long(ch)))
FIN

En détail

La fonction Valide n’a ni variable locale ni module appelé : conformément aux conventions, elle n’a pas de TDOL. Son absence n’est pas un oubli.

Remarque importante. L’ouverture en mode "wb" se place avant la boucle : si elle était dans la boucle, le fichier serait effacé à chaque joueur et ne contiendrait à la fin que le dernier.

En détail

La borne de fin de Sous_chaine étant exclue, Sous_chaine(ch, 1, Long(ch)) rend les neuf caractères qui suivent la lettre. Avec la borne 9, le dernier caractère ne serait pas testé, et un code comme A12345678X serait accepté.

2. Ajouter

Procédure Ajouter (nomF : Chaîne de caractères)
DEBUT
    Si Taille(nomF) = 32 Alors
        Écrire("La poule est complète.")
    Sinon
        Répéter
            Écrire("Code du nouveau joueur : "), Lire(E.Code)
        Jusqu'à Valide(E.Code)
        Si Existe(nomF, E.Code) Alors
            Écrire("Ce joueur existe déjà.")
        Sinon
            Répéter
                Écrire("Score : "), Lire(E.Score)
            Jusqu'à E.Score ≥ 0
            Ouvrir(nomF, F, "ab")
            Écrire(F, E)
            Fermer(F)
        FinSi
    FinSi
FIN

TDOL

ObjetType / Nature
FFichJoueur
EJoueur
ValideFonction
ExisteFonction
TailleFonction
Fonction Taille (nomF : Chaîne de caractères) : Entier
DEBUT
    Ouvrir(nomF, F, "rb")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire(F, E)
        n ← n + 1
    Fin Tant que
    Fermer(F)
    Retourner n
FIN

TDOL

ObjetType / Nature
FFichJoueur
EJoueur
nEntier
Fonction Existe (nomF, c : Chaîne de caractères) : Booléen
DEBUT
    Ouvrir(nomF, F, "rb")
    trouve ← Faux
    Tant que Non(Fin_fichier(F)) Et Non(trouve) Faire
        Lire(F, E)
        Si E.Code = c Alors
            trouve ← Vrai
        FinSi
    Fin Tant que
    Fermer(F)
    Retourner trouve
FIN

TDOL

ObjetType / Nature
FFichJoueur
EJoueur
trouveBooléen

En détail

La fonction Existe est celle du paragraphe 4.7, appliquée à un autre fichier : seul le champ comparé change. Le score n’est saisi qu’après le contrôle du code, puisqu’il est inutile de le demander pour un joueur refusé.

Le contrôle de la taille protège aussi la procédure Trier : son tableau compte 32 cases, le nombre maximal de joueurs d’une poule. Sans ce contrôle, l’ajout d’un 33ᵉ joueur ferait déborder le tableau au chargement.

3. Trier

Procédure Trier (nomF : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, F, "rb")
    n ← 0
    Tant que Non(Fin_fichier(F)) Faire
        Lire(F, E)
        T[n] ← E
        n ← n + 1
    Fin Tant que
    Fermer(F)
    Pour i de 1 à n - 1 Faire
        aux ← T[i]
        j ← i
        Tant que (j > 0) Et ((T[j-1].Score < aux.Score)
                  Ou ((T[j-1].Score = aux.Score) Et (T[j-1].Code > aux.Code))) Faire
            T[j] ← T[j-1]
            j ← j - 1
        Fin Tant que
        T[j] ← aux
    Fin Pour
    Ouvrir(nomF, F, "wb")
    Pour i de 0 à n - 1 Faire
        Écrire(F, T[i])
    Fin Pour
    Fermer(F)
FIN

TDNT local — Tab = Tableau de 32 Joueur

TDOL

ObjetType / Nature
FFichJoueur
TTab
E, auxJoueur
n, i, jEntier

En détail

C’est le tri par insertion de l’application 1, appliqué à un tableau d’enregistrements et avec deux critères. Le second critère est indispensable : sans lui, deux joueurs de même score seraient classés dans l’ordre de leur saisie, ce qui ne permet pas d’attribuer un rang de façon certaine.

La taille du tableau est 32, le nombre maximal de joueurs d’une poule.

4. Classement

Procédure Classement (nomF, nomFt : Chaîne de caractères)
DEBUT
    Ouvrir(nomF, Fd, "rb")
    Ouvrir(nomFt, Ft, "w")
    r ← 1
    Tant que Non(Fin_fichier(Fd)) Faire
        Lire(Fd, E)
        Écrire_nl(Ft, Convch(r) + ") " + E.Code + " : " + Convch(E.Score))
        r ← r + 1
    Fin Tant que
    Fermer(Fd)
    Fermer(Ft)
FIN

TDOL

ObjetType / Nature
FdFichJoueur
FtFichier texte
EJoueur
rEntier

Exemple. Pour une poule de huit joueurs complétée par le joueur K777777777, le fichier Classement.txt obtenu après le tri est le suivant :

1) E222222222 : 95
2) G333333333 : 95
3) A123456789 : 70
4) D999999999 : 70
5) K777777777 : 70
6) B000000001 : 50
7) C555555555 : 50
8) F111111111 : 12
9) H444444444 : 0

En détail

Le rang r et le score sont des entiers : ils sont convertis par Convch avant la concaténation. Les trois joueurs à 70 points apparaissent dans l’ordre croissant de leur code, comme l’exige la question 3.

6. Erreurs fréquentes

Les erreurs suivantes, relevées sur le module Transferer du paragraphe 5.1, sont les plus fréquentes dans les copies.

Instruction erronéeInstruction correcteExplication
Ouvrir(nomD, Fd, "rb")Ouvrir(nomD, Fd, "wb")le fichier de données est créé, et non lu
Tant que Fin_fichier(Ft) FaireTant que Non(Fin_fichier(Ft)) Fairesans Non, la boucle ne s’exécute jamais
Lire(Ft, ch)Lire_ligne(Ft, ch)sur un fichier texte, Lire prend le fichier entier
Nom ← Sous_chaine(reste, 0, p)E.Nom ← Sous_chaine(reste, 0, p)Nom est un champ de l’enregistrement E
Écrire(E, Fd)Écrire(Fd, E)le nom logique du fichier est le premier paramètre

Remarque importante. Aucune de ces instructions n’est fausse en elle-même : Lire est correcte sur un fichier de données, et le mode "rb" est correct pour consulter un fichier. Une instruction sur un fichier n’est juste ou fausse que par rapport au type du fichier et à l’usage que l’on veut en faire.

7. Retenons

Fichier. Un fichier est un ensemble structuré de données, nommé et enregistré sur un support de stockage. Il conserve les données après la fin de l’exécution du programme.

Deux types. Le fichier texte est une suite de caractères organisée en lignes. Le fichier de données est une suite d’objets de même type, manipulée en mode binaire.

Parcours. Un fichier se parcourt du début vers la fin. Lorsque le nombre d’éléments est inconnu, on utilise Tant que Non(Fin_fichier(F)) Faire, avec la lecture à l’intérieur de la boucle.

Trois traitements. Le parcours ne modifie rien. L’ajout, en mode "a" ou "ab", est la seule modification qui ne réécrit pas le fichier. Toutes les autres modifications passent par une reconstruction : chargement dans un tableau, traitement du tableau, réécriture du fichier.

Transferts. Du texte vers les données, on découpe chaque ligne et l’on convertit les champs numériques par Valeur. Des données vers le texte, on convertit les champs numériques par Convch, puis l’on concatène.

Python. Python n’a pas de fonction Fin_fichier : on teste la chaîne vide pour un fichier texte, et l’on utilise try / except pour un fichier de données. La forme Python est une traduction de l’algorithme, et non son modèle.

OpérationAlgorithmiquePython
OuvrirOuvrir(nom_physique, F, mode)F = open(nom_physique, mode)
FermerFermer(F)F.close()
Lire une ligneLire_ligne(F, ch)ch = F.readline()
Lire tout le fichier texteLire(F, ch)ch = F.read()
Écrire une chaîneÉcrire(F, ch)F.write(ch)
Écrire une ligneÉcrire_nl(F, ch)F.write(ch + "\n")
Lire un objetLire(F, E)E = load(F)
Écrire un objetÉcrire(F, E)dump(E, F)
Fin de fichierFin_fichier(F)chaîne vide, ou try / except

Teste tes connaissances

Un quiz corrigé question par question, puis des flashcards pour mémoriser les notions du chapitre.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *