Lire et écrire dans un fichier txt?

WRInaute passionné
Bonjour,

Je me pose quelques questions sur la fonction fopen() et compagnie !

Pourquoi ne peut on pas écrire puis lire un fichier .txt si on ne ferme pas la connexion juste après l'écriture?

Un exemple qui ne fonctionne pas :
Code:
<?php
$fichier_a_ouvrir = fopen ("b.txt", "a+");
//on écrit dans le fichier
fwrite($fichier_a_ouvrir,"Bonjour et bienvenue :)!<br/>");
//on lit tout
while (!feof($fichier_a_ouvrir)) {
$ligne = fgets($fichier_a_ouvrir, 1024);
// le echo ne retourne rien
echo $ligne;
}
fclose ($fichier_a_ouvrir);
?>
Un exemple qui fonctionne :
Code:
<?php
$fichier_a_ouvrir = fopen ("b.txt", "a+");
fwrite($fichier_a_ouvrir,"Bonjour et bienvenue :)!<br/>");
//Ici je ferme puis ré ouvre la connexion pour lire le contenu du fichier
fclose ($fichier_a_ouvrir);
$fichier_a_ouvrir = fopen ("b.txt", "a+");
while (!feof($fichier_a_ouvrir)) {
$ligne = fgets($fichier_a_ouvrir, 1024);
echo $ligne;
}
fclose ($fichier_a_ouvrir);
?>

A quoi sert exactement le chiffre "1024" dans la fonction fgets() ?
Exemple :
Code:
<?php
$fichier_a_ouvrir = fopen ("b.txt", "r");
$contenu_du_fichier = fgets ($fichier_a_ouvrir, 1024);
fclose ($fichier_a_ouvrir);
echo $contenu_du_fichier;
?>
J'ai crue comprendre que ce chiffre permet d'afficher le nombre de lettres ... En supposant que mon texte contient 2000 lettres et que j'indique par exemple "150" dans fgets(), ça fonctionne.
Par contre, si j'indique "2048", seul la première ligne du fichier est lut malgré qu'elle contient moins de 2048 caractères ... Pourquoi la fonction ne passe pas à la ligne suivante pour afficher le reste?

Autre question ^^ :

J'ai crus comprendre que le chiffre "1024" indique la première ligne ... Quand est il vraiment ? Quelle chiffre est ton censé mettre si on lit qu'une seule ligne ou l'intégralité d'un fichier ? Je vois du 1024 ou du 4096 dans les tutos. que je trouve ??

Dernière question :

Lors de la lecture intégrale d'un fichier et dans la boucle "while", doit on utiliser :
Code:
$ligne = fgets($fichier_a_ouvrir, 1024);
ou
Code:
$ligne = fread($fichier_a_ouvrir, 1024);
???
Les 2 affichent le même résultat et je ne vois pas ou est la différence ??

Merci
 
WRInaute occasionnel
fgets($stream, $limit) retourne $limit octets dans le stream $stream jusqu'au prochain symbole EOL (CR/LF ou CR selon ta religion).

En moins abscons, fgets() retourne une seule ligne de ton fichier, avec une limite (pour éviter de saturer la pile si tu lis une ligne de 1 Mo).

C'est pourquoi on utilise souvent:

while($line = fgets($stream, 1024)) {}

1024 c'est par convention, 1 Ko c'est pratique à travailler.

Si tu utilises PHP > 5.0, je te conseille d'oublier tout ca et d'utiliser 2 fonctions bien plus pratiques:

file_get_contents($filename) et file_put_contents($filename, $contents).

Cf la doc php pour les arguments supplémentaires (contextes de stream, flags de manipulation des EOL).
 
WRInaute accro
Quand tu accèdes à un fichier, il y a un "pointeur de fichier" qui indique où on lit/écrit. Dans ton premier exemple, tu commences par écrire, donc le pointeur se déplace et est toujours à la fin de ce que tu viens d'écrire. Ensuite, tu lis, mais forcément, tu es à la fin du fichier, donc il n'y a rien à lire. Il faut utiliser fseek pour modifier le pointeur et le ramener au début par exemple (ceci dit, l'intérêt de relire ce que tu viens d'écrire...).

Note aussi que tu utilises fopen en mode "a+" qui signifie qu'à la base, tu ajoutes à la fin de ton fichier.

fgets lit toujours une "ligne", avec une limite éventuelle sur la taille de cette ligne. Si tu veux lire exactement X octets, utilise fread (note qu'évidemment fread peut te renvoyer moins que X si tu es à la fin du fichier par exemple).

Si tu fais une lecture intégrale et que tu te moques de la structure du fichier (i.e. tu n'as pas besoin de le découper en lignes), le résultat est effectivement le même dans les deux cas, mais sur un fichier texte par exemple (i.e. qui contient des lignes plus courtes que la taille max donnée), ça va faire plus d'appels avec fgets qu'avec fread.

Il est temps d'aller lire la doc :)

Jacques.
 
WRInaute passionné
Merci à vous pour ces explications :D et si je pose la question ici, c'est bien parce que je n'ai pas tout comprit en lisant php.net ^^!
 
Discussions similaires
Haut