Principes de programmation

Gestion des fichiers

2526 · Dekens Antoine

Persistance des données

Pour permettre de sauvegarder des données sur un serveur (Persistance), nous avons deux possibilités :

  • Sauvegarder et récupérer les données dans un fichier (.txt, .json, .yml, etc.).
  • Interagir avec un SGDB.
Dans un premier temps nous. allons voir comment interagir avec des fichiers : lire, écrire et mettre à jour des données

fopen

La fonction fopen permet d'ouvrir un fichier et s'il existe de renvoyer un pointeur (notre position dans le fichier). Nous devons lui passer 2 paramètres :

  1. filename : l'url du fichier à ouvrir
  2. mode : indique le mode d'ouverture

Paramètre mode

Le paramètre mode a plusieurs valeurs possibles, nous n'en verrons que 3 :

  • r (read) : ouvrre en lecture seule avec un pointeur en début de fichier.
  • w (write) : ouvre en écriture seule, place le pointeur en début de fichier et supprime son contenu actuel. Si le fichier n'existe pas on tente de le créer.
  • a (add) : ouvre en écriture seule et place le pointeur en fin de fichier ce qui nous permet d'ajouter du contenu. Si le fichier n'existe pas on tente de le créer.

Valeurs de retour

  • false : n'a pas pu ouvrir le fichier (mauvais chemin, pas les droits, etc.)
  • pointeur : le fichier est ouvert à une certaine position (dépendant du mode)
<?php
  // On stocke le chemin vers un fichier à ouvrir
  $pathToMyFile = "path/to/my/file.txt";

  // Demande d'ouverture du fichier 
  // en lecture seule (mode "r")
  $filePointer = fopen( $pathToMyFile, "r" );

  if( $filePointer ){
    echo "Le fichier existe et est correctement ouvert";
    
  } else {
    echo "Fichier inexistant ou ne peut être ouvert";
  }
?>

fclose

La fonction fclose permet de fermer le fichier précédemment ouvert en lui passant un paramètre :

  1. file pointer : le pointeur du fichier ouvert (la réponse de fopen).

Valeurs de retour

  • false : une erreur s'est produite lors de la fermeture
  • true : le fichier à bien été fermé
<?php
    …
    $fileClosed = fclose( $filePointer );

    // Si ce n'a pas fonctionné on affiche l'erreur
    if( !$fileClosed ){
      echo "Une erreur est survenue lors de la fermeture.";
    }
?>
<?php
    $fileClosed = fclose( $filePointer );

    // Si ce n'a pas fonctionné on affiche l'erreur
    if( !$fileClosed ){
      echo "Une erreur est survenue lors de la fermeture.";
    }
?>

Exercice A

Créer un fichier getFile.php et utiliser les fonctions fopen et fclose pour ouvrir le fichier manga.txt ci-dessous. Le but est de pouvoir afficher avec echo les différents scénarios possibles (réussite et échec d'ouverture et de fermeture).

N'oublions pas d'avoir un squelette HTML valide.

fgetc

La fonction fgetc permet de lire un caractère et d'avancer le pointer au caractère suivant avec un paramètre :

  1. file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Autrement dit : on avance lettre par lettre.

Valeurs de retour

  • false : une erreur s'est produite lors de la lecture ou la fin du fichier a été atteinte.
  • string : le caractère lu sous forme de string
<?php
    $filePointer = fopen( 'path/to/my/file.txt', 'r' );
    if( $filePointer ){
      $lastLetter = fgetc( $filePointer );

      if( $lastLetter ){
        echo "La dernière lettre lue est $lastLetter.";
      } else {
        echo 'Erreur ou fin de fichier.'
      }
      … // Fermeture de fichier
    } else { … } // Erreur d'ouverture
?>

feof

La fonction feof vérifie si le pointeur a atteint la fin du fichier avec un paramètre :

  1. file pointer : le pointeur du fichier ouvert (la réponse de fopen).

Valeurs de retour

  • false : le pointeur n'a pas atteint la fin du fichier.
  • true : le pointer a atteint la fin du fichier ou qu'une erreur s'est produite.
<?php
    $filePointer = fopen( 'path/to/my/file.txt', 'r' );
    if( $filePointer ){

      // Tant que le pointeur n'a pas atteint la fin du fichier
      // la boucle while permet de parcourir tout les caractères du fichier.
      while( !feof( $filePointer ) ){
        $lastLetter = fgetc( $filePointer );
        if( $lastLetter ){
          echo "La dernière lettre lue est $lastLetter.";
        }
      }
      … // Fermeture de fichier
    } else { … } // Erreur d'ouverture
?>

Exercice B

Sur base de l'exercice précédent, afficher chaque lettre du fichier manga.txt avec un retour à la ligne :

<?php
    // Retour à la ligne
    echo "<br>";
?>

fgets

La fonction fgets permet retourner la ligne courante où se situe notre pointer et de l'avancer au début de la prochaine ligne avec un paramètre :

  1. file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Autrement dit : on avance ligne par ligne.

Valeurs de retour

  • false : une erreur s'est produite lors de la lecture ou la fin du fichier a été atteinte.
  • string : une chaîne de caractères contenant la ligne lue
<?php
    $filePointer = fopen( 'path/to/my/file.txt', 'r' );
    if( $filePointer ){
      $lastLine = fgets( $filePointer );

      if( $lastLine ){
        echo "La dernière ligne lue est $lastLine.";
      } else {
        echo 'Erreur ou fin de fichier.'
      }
      … // Fermeture de fichier
    } else { … } // Erreur d'ouverture
?>

Exercice C

Sur base de l'exercice précédent, afficher chaque ligne du fichier manga.txt avec un retour à la ligne :

fwrite

La fonction fwrite permet d'écrire une chaîne de caractère(s) dans le fichier, à l'endroit du pointeur. Deux paramètres sont nécessaires :

  1. file pointer : le pointeur du fichier ouvert (la réponse de fopen).
  2. data : la chaîne de caractère(s) à insérer
Le mode doit permettre d'écrire.

Valeurs de retour

  • false : une erreur s'est produite
  • number : le nombre de caractère(s) inséré(s) si l'écriture a réussie
<?php
    $filePointer = fopen( 'path/to/my/file.txt', 'w' );
    if( $filePointer ){
      $stringToInsert = "Coucou";
      $charsCount = fwrite( $filePointer, $stringToInsert );

      if( $charsCount ){
        echo "le nombre de caractère(s) inséré(s) est $charsCount.";
      } else {
        echo 'Erreur ou fin de fichier.'
      }
      … // Fermeture de fichier
    } else { … } // Erreur d'ouverture
?>

Exercice D

Sur base de l'exercice précédent, afficher les informations sous forme de tableau en HTML. La fonction explode est a utiliser.

Exercice E

Sur base de l'exercice précédent, ajouter une nouvelle ligne à la suite de notre fichier en y ajoutant un titre, un auteur ainsi que son/ses genre(s) et afficher le tout dans le tableau.

Comme les informations sont affichées via un explode, il faudra insérer les données en respectant la structure du fichier originel.

1/2

1/1