Lire et écrire dans un fichier



Maintenant que nous savons ouvrir et fermer notre fichier, nous allons apprendre à le lire et à le modifier.


Lire



Pour lire, on a deux possibilités :

  • lire caractère par caractère avec la fonction fgetc ;
  • lire ligne par ligne avec fgets.

En général, on se débrouillera pour mettre une information par ligne dans notre fichier. On se sert donc assez peu de fgetc qui est plutôt lourd à utiliser (il faudrait faire une boucle pour lire caractère par caractère).

Dans notre cas, on va supposer que notre fichier ne contient qu'une ligne : le nombre de pages qui ont été vues sur le site.
Pour récupérer ce nombre, il faudra procéder comme ceci :

Code : PHP

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

<?php

// 1 : on ouvre le fichier

$monfichier = fopen('compteur.txt', 'r+');

     

// 2 : on lit la première ligne du fichier

$ligne = fgets($monfichier);

      

// 3 : quand on a fini de l'utiliser, on ferme le fichier

fclose($monfichier);

?>



Il faut indiquer à fgets le fichier à lire. On lui donne notre variable $monfichier qui lui permettra de l'identifier.
fgets renvoie toute la ligne (la fonction arrête la lecture au premier saut de ligne). Donc notre variable $ligne devrait contenir la première ligne du fichier.

Et si mon fichier fait quinze lignes, comment je fais pour toutes les lire ?



Il faut faire une boucle. Un premier fgets vous donnera la première ligne. Au second tour de boucle, le prochain appel à fgets renverra la deuxième ligne, et ainsi de suite.

C'est un peu lourd, mais si on stocke assez peu d'informations dans le fichier, cela peut suffire. Sinon, si on a beaucoup d'informations à stocker, on préfèrera utiliser une base de données (on en parlera dans la prochaine partie).


Écrire



Pour l'écriture, on n'a qu'une seule possibilité : utiliser fputs.
Cette fonction va écrire la ligne que vous voulez dans le fichier.

Elle s'utilise comme ceci :

Code : PHP

1

<?php fputs($monfichier, 'Texte à écrire'); ?>



Toutefois, il faut savoir où l'on écrit le texte. En effet, le fonctionnement d'un fichier est assez étrange…

  1. Vous l'ouvrez avec fopen.
  2. Vous lisez par exemple la première ligne avec fgets.
  3. Oui mais voilà : maintenant, le « curseur » de PHP se trouve à la fin de la première ligne (vu qu'il vient de lire la première ligne), comme dans la figure suivante.

Le curseur de PHP est à la fin de la première ligne



Si vous faites un fputs juste après, il va écrire à la suite ! Pour éviter ça, on va utiliser la fonction fseek qui va replacer le curseur où l'on veut dans le fichier. En l'occurence, on va replacer le curseur au début du fichier en faisant :
fseek($monfichier, 0);
Notre curseur sera alors repositionné au début, voyez donc la figure suivante.

Le curseur de PHP est replacé à l'endroit choisi


Si vous avez ouvert le fichier avec le mode 'a' ou 'a+', toutes les données que vous écrirez seront toujours ajoutées à la fin du fichier. La fonction fseek n'aura donc aucun effet dans ce cas.


  1. Ouf, notre curseur est au début du fichier, on peut maintenant faire un fputs. La ligne va s'écrire par-dessus l'ancienne, ce qui fait que l'ancien texte sera écrasé (remplacé par le nouveau).

Pour y voir un peu plus clair, je vous propose ce code source qui compte le nombre de fois que la page a été vue :

Code : PHP 

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

<?php

$monfichier = fopen('compteur.txt', 'r+');

       

$pages_vues = fgets($monfichier); // On lit la première ligne (nombre de pages vues)

$pages_vues++; // On augmente de 1 ce nombre de pages vues

fseek($monfichier, 0); // On remet le curseur au début du fichier

fputs($monfichier, $pages_vues); // On écrit le nouveau nombre de pages vues

        

fclose($monfichier);

      

echo '<p>Cette page a été vue ' . $pages_vues . ' fois !</p>';

?>




Ce n'était pas si dur, vous voyez.

Voici la description des quatre lignes du milieu (les plus importantes) :

  1. on récupère la première ligne du fichier, qui est le nombre de pages qui ont été vues pour le moment sur le site ;
  2. on ajoute 1 à la variable $pages_vues. Si elle valait 15, elle vaudra désormais 16 ;
  3. on replace notre fameux « curseur » au début du fichier (parce que sinon, il se trouvait à la fin de la première ligne et on aurait écrit à la suite) ;
  4. on écrit notre nouveau nombre de pages vues dans le fichier, en écrasant l'ancien nombre.


Le fichier doit exister et contenir un nombre (tel que 0) pour que ce code fonctionne.
De plus, si vous avez oublié de mettre un CHMOD à 777 sur le fichier compteur.txt, vous aurez l'erreur suivante :
« Warning: fopen(compteur.txt): failed to open stream: Permission denied ».
Ici, PHP essaie de vous dire qu'il n'a pas réussi à ouvrir le fichier car il n'a pas le droit d'écrire dedans. Il faut donc absolument mettre ce CHMOD si vous voulez pouvoir toucher au fichier !



Voilà, vous venez de voir comment on se sert d'un fichier : ouverture, lecture, écriture, fermeture.
Pour un gros fichier, cela devient vite compliqué, mais pour un petit fichier comme celui-ci, cela convient très bien.

Dans la suite de ce cours, nous allons découvrir une méthode plus efficace pour stocker des données : nous allons utiliser une base de données MySQL.

Créé avec HelpNDoc Personal Edition: Créer des documents d'aide HTML facilement