Blog ENI : Toute la veille numérique !
💥 Un livre PAPIER acheté
= La version EN LIGNE offerte pendant 1 an !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Algorithmique - Techniques fondamentales de programmation
  3. Techniques fondamentales de programmation
Extrait - Algorithmique - Techniques fondamentales de programmation Exemples en PHP (nombreux exercices corrigés) (4e édition)
Extraits du livre
Algorithmique - Techniques fondamentales de programmation Exemples en PHP (nombreux exercices corrigés) (4e édition) Revenir à la page d'achat du livre

Les fichiers

Les différents fichiers

1. Préambule

Les fichiers sont difficiles à décrire en algorithmique. Durant des années, jusqu’au milieu des années 1990, le COBOL a régné en maître chez les langages de programmation en informatique de gestion. Ce langage était aussi puissant dans ce domaine que sa syntaxe était pratique. Ceux d’entre vous qui connaissent un peu le COBOL savent de quoi il est question ici. Une des sources de sa puissance était sa capacité à gérer les fichiers et les enregistrements structurés, dans tous les sens, dans toutes les formes.

Seulement, le COBOL est passé de mode pour les nouveaux développements. Les multitudes de fichiers de données diverses et variées ont été remplacées par d’autres structures, notamment par des bases de données relationnelles, rendant caduque l’étude de la plupart des types de fichiers au profit de langages comme le SQL. Pourtant, les bases de données elles-mêmes sont souvent stockées dans des fichiers.

Aussi, ce chapitre est plus court que les autres. Il serait possible de décrire une foule de types de fichiers : des livres complets existent sur ce thème.

Les bases et définitions théoriques seront à peu près toutes couvertes, mais seuls seront traités les fichiers textes. PHP ne sachant pas directement gérer des fichiers de type indexés, cela résout singulièrement le problème.

2. Problématique

Qu’est-ce qu’un fichier ? Retrouver des informations dans des fichiers, c’est exactement la même chose que dans la réalité. Quand vous avez une seule information à retenir dans votre tête, c’est facile. Quand vous en avez des milliers, c’est une mission impossible. Vous allez utiliser un agenda, remplir des fiches. Le cerveau a certes des capacités incroyables, mais comment retenir toutes les transactions bancaires de millions de comptes pour une banque ?

À cela, ajoutez deux problèmes :

  • Malgré la puissance de vos ordinateurs, la capacité mémoire reste souvent limitée. Un ordinateur 32 bits "standard" (bureau, jeu) est souvent limité à 8 Go. Parfois...

Les enregistrements

Ce chapitre se concentre sur les fichiers texte. Dans ceux-ci, vous devez définir la structure de vos enregistrements. Bien que tout soit possible, notamment avec des structures en arborescence comme le XML, vous pouvez initialement choisir entre deux méthodes assez simples : les enregistrements avec délimiteurs ou à largeur fixe.

1. Les délimiteurs

Les enregistrements délimités sont courants sous Unix. Dans chaque ligne, les valeurs individuelles sont appelées des champs et sont séparées entre elles par un caractère particulier appelé caractère de séparation ou caractère de délimitation, ou enfin délimiteur. N’importe quel caractère peut convenir, cependant il ne doit pas se retrouver dans la valeur d’un champ, ce qui aurait pour effet de casser la structure de l’enregistrement. Ce sont souvent le point-virgule ";" ou les deux points ":" qui sont utilisés.

Les champs d’enregistrements sont généralement encadrés par des guillemets lorsqu’il s’agit de chaînes de caractères, rien pour des valeurs numériques. Ce n’est pas une affirmation : ce n’est pas toujours le cas et c’est à vous de gérer le type d’une valeur donnée, au sein de votre programme.

Voici un simple exemple de contenu de fichier délimité de type courant sous Unix :

root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/bin/bash 
daemon:x:2:2:Daemon:/sbin:/bin/bash 
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash 
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false 
news:x:9:13:News system:/etc/news:/bin/bash 
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash 

Les plus perspicaces d’entre vous auront reconnu un morceau du fichier /etc/passwd qui contient quelques informations sur les comptes des utilisateurs du système Unix. Chaque ligne est un enregistrement dont la structure est la suivante :

  • Un séparateur ":" délimite les différents champs.

  • Il y a sept champs, numérotés (par convention) de 1 à 7.

  • 1er champ : nom de l’utilisateur (son login).

  • 2e champ : indicateur de mot de passe (ici stocké ailleurs).

  • 3e champ : UID, identifiant numérique unique...

Fichier texte séquentiel

1. Ouvrir et fermer un fichier

Vous devez tout d’abord déclarer le nom logique du fichier : une variable qui permettra, associée au fichier, de travailler avec. Ceci se place comme d’habitude dans la section Var. Vous indiquez ensuite le type d’accès : séquentiel, direct, indexé, etc. Notez qu’en accès direct, vous pouvez aussi travailler en mode séquentiel. 

VAR 
  fic:fichier séquentiel 

Vous devez ensuite ouvrir le fichier, en associant nom logique et nom du fichier, avec le mode d’ouverture souhaité. Ceci s’effectue avec l’instruction Ouvrir.

Ouvrir "toto.txt" dans fic en lecture 

Vous trouverez aussi parfois cette syntaxe sous forme de fonction, plus proche de certains langages :

ficImages/flechegauche.PNGOuvrir("toto.txt","lecture") 

La première syntaxe est souvent préférable en algorithmique. Pour fermer un fichier, utilisez l’instruction Fermer suivie du nom logique du fichier.

Fermer fic 

Il existe aussi une syntaxe fonctionnelle, mais les mêmes remarques s’appliquent : utilisez la première en cas de doute.

Fermer(fic) 

Ne placez pas le nom du fichier dans les instructions de lecture, écriture et de fermeture. Le programme ne connaît pas le nom du fichier, mais seulement son nom logique.

Aussi le début d’un éventuel programme ressemblerait à ceci :

Programme OUVRE 
Var 
  fic :fichier séquentiel 
  nom :chaîne 
Début 
  nomImages/flechegauche.PNG"toto.txt" 
  Ouvrir nom dans fic en lecture 
  /* traitements */ 
  Fermer fic 
Fin 

2. Lire et écrire des enregistrements

a. Lecture

Pour simple rappel, les enregistrements sont ici les lignes d’un fichier texte, un enregistrement étant équivalent à une ligne. La lecture d’une ligne se fait via l’instruction Lire. Lire lit l’enregistrement présent à la position actuelle du fichier, puis se place sur l’enregistrement suivant. À l’ouverture du fichier, Lire lit la première ligne. Un nouveau Lire lira la deuxième et ainsi de suite jusqu’à la fin. C’est pour cela que la lecture est dite séquentielle. Vous trouverez aussi la même instruction...

Exercices

Exercice 1

Écrire un programme en PHP permettant de créer un fichier texte s’il n’existe pas puis écrire dans ce fichier « date et heure courante: » suivi de la date du jour. En PHP, la date s’affiche avec la fonction date(’d.m.Y G:i:s’)

Exercice 2

Écrire un programme en PHP permettant de créer un fichier texte qui stocke le nombre de fois qu’une page a été vue.

Exercice 3

Soient client.txt et prospect.txt deux fichiers dont les enregistrements ont la même structure. Écrire un programme en PHP qui recopie tout le contenu des fichiers client et prospect dans le fichier final.txt.