Aller au contenu

Savoir si fichier .txt est vide


Sujets conseillés

Posté

Bonjour, :)

J'ai un nouveau pb avec mon blog!!

J'ai un script ph qui lit et retranscrit sur la page le contenu d'un fichier texte.

Le pb est que si ce fichier texte est vide, j'ai un message d'erreur sur la page car le script ne peut pas lire du vide... :rolleyes:

J'ai donc essayé de faire une boucle conditionnelle (ou un truc du genre) pour qu'il affiche un message si le fichier est vide.

Mais comme je ne suis pas encore très douée en php, j'ai du faire des erreurs de syntaxe ou je sais pas quoi.... :blush:

Voici mon code:

if ($file =="") {

echo "pas de commentaire";

}

else {

$session = fopen( $file, "r");

$contenu = fread( $session,filesize($file));

fclose ( $session );

echo $contenu;

}

et le message d'erreur:

Warning: fread(): Length parameter must be greater than 0. in ce fichier à la ligne violette

Merci ;)

Posté

a essayer :

if ($file =="") {

echo "pas de commentaire";

}

else {

$session = fopen( $file, "r");

$contenu='';

if ($session) //lecture ok

{

  $fsize = filesize($file);

  $contenu = $fsize > 0 ? fread( $session, $fsize) : '';

  fclose ( $session );

}

echo $contenu;

}

:)

Posté (modifié)

Tu peux aussi essayer :

if ($file != "") {
 if ($session = fopen($file, "r") {
 
   while ($ligne = fgets($session, 2048)) {
       
      // Ce que tu veux avec un traitement par ligne
   }
 }
}

Modifié par Titag
Posté

Voici le code que je t'ai donné avec un peu plus de commentaires :

if ($file != "") {  // Si le nom du fichier à ouvrir n'est pas vide
 if ($session = fopen($file, "r") { // Si l'ouverture du fichier est réussie
 
   while ($ligne = fgets($session, 2048)) {  // On parcours chaque ligne du fichier
       
      // Ce que tu veux avec un traitement par ligne
   }
 }
}

Voili :D

Posté

C'est une longueur choisie quasi-arbitrairement :)

fgets() lit une ligne sur la longeur spécifiée. Pour être quasi certain de lire toute la ligne on donne souvent une longeur de 2048 octets (ou 1024 ca dépend)

En général les lignes sont beaucoup moins longues que ca :)

Si tu veux des précisions : Voir ici :)

Posté

Bonjour,

en fait, quand je ne connait pas la longueur de la ligne, je met 4096. Si je la connais, je mets la longueur exacte. Ca permet de gagner du temps.

Si tu mets 1, et que tu demandes à renvoyer le contenu de la ligne, alors il ne va te renvoyer que le premier caractère.

Posté

Au secours!!!

En fait, ma methode ne marche pas bien!!

Le message si pas de message marche bien, mais s'il y a un message, il ne l'affiche pas et reste avec le message disant qu'il n'y a pas de message.... :wacko:

Euh.. en gros, les messages ne s'affichent pas!

Voilà mon code, si vous pouviez m'aider à le corriger, juste pour savoir où se trouve l'erreur...

if ($contenu =="") {
echo "Ecrivez le premier commentaire!";
}
else {
$session = fopen( $file, "r");
$contenu = fread( $session,filesize($file));
fclose ( $session );
echo $contenu;
}

Sinon, je vais essayer la méthode précedente, qui est plus courte, mais qui ne m'affiche pas de message si le fichier texte est vide ... ;)

Merci de votre aide!! :up:

Posté

Avec la méthode de Titag, j'ai:

Parse error: parse error, unexpected '{' in /var/www/free.fr/0/7/gribouille26/blog/id01.php on line 45

sur cette ligne donc:

 if ($session = fopen($file, 'r') { // Si l'ouverture du fichier est réussie

Si j'enlève la { il me dit que c'est le WHILE qui pose pb!!!

De plus, il manque la ligne pour fermer la session.... :huh:

Avec ma méthode, j'ai beau faire, il ne m'affiche pas le fichier texte.... :nono:

Posté

J'ai pondu un petit truc avec le code de Titag:

<?php
$session = fopen($file,"r");
if (!$session) die("Impossible d'ouvrir le fichier");   // au cas ou le fichier existe pas
while (!feof($session)) {
$ligne = fgets($session, 1024);   // On parcours chaque ligne du fichier
if (!feof($session)) echo "$ligne<br>";   // ecrit les lignes par lignes
}
fclose($session);
?>

Ca m'affiche bien les messages, mais pas de message si le fichier est vide...

J'ai essayé comme ça:

$session = _AT_fopen($file,"r");
$contenu = fread( $session,filesize($file));
if (!$contenu) die("pas message");
while (!feof($session)) {
$ligne = fgets($session, 1024);
if (!feof($session)) echo "$ligne<br>";
}
fclose($session);

Mais ça ne m'affiche plus le contenu du fichier texte!!

Posté

$session = fopen($file,"r");
if (!$session) die("Impossible d'ouvrir le fichier");   // au cas ou le fichier existe pas

Ceci n'est pas bon.

En effet, en fonction du register_globals, la variable $session est toujours définie, puisque tu fais appel à elle. Même si le premier test échoue.

Or là, tu testes si elle n'est pas définie.

De plus , il serait bien de ne pas confondre les sessions avec les pointeurs de fichier. Là, tu cherches un identifiant de ressources. Tu pourrais mélanger les 2 dans un programme assez long.

if (!$contenu) die("pas message");

même problème que précédemment. $contenu sera toujours défini. De plus, tu as ouvert le fichier, il est bon de le fermer. Or, en executant un die(), tu échappes le fclose de fin de programme.

$contenu = fread( $session,filesize($file));
if (!$contenu) die("pas message");
while (!feof($session)) {

Là, tu commences par prendre le contenu du fichier, et ainsi tu places ton curseur à la fin du fichier. Puis, tu demandes à avoir le contenu jusqu'à la fin.. Or tu te trouves déjà à la fin du fichier.

Oublies fread, travailles avec fgets.

;)

Anonymus.

Posté
$session = fopen($file,"r");
if (!$session) die("Impossible d'ouvrir le fichier");   // au cas ou le fichier existe pas

Ceci n'est pas bon.

En effet, en fonction du register_globals, la variable $session est toujours définie, puisque tu fais appel à elle. Même si le premier test échoue.

Or là, tu testes si elle n'est pas définie.

<{POST_SNAPBACK}>

Pourtant, cette partie marche. Si je ne met pas de fichier .txt, j'ai bien ce message... :huh:
if (!$contenu) die("pas message");

même problème que précédemment. $contenu sera toujours défini.

<{POST_SNAPBACK}>

Et si mon fichier .txt est vide?
$contenu = fread( $session,filesize($file));
if (!$contenu) die("pas message");
while (!feof($session)) {

Là, tu commences par prendre le contenu du fichier, et ainsi tu places ton curseur à la fin du fichier. Puis, tu demandes à avoir le contenu jusqu'à la fin.. Or tu te trouves déjà à la fin du fichier.

<{POST_SNAPBACK}>

Oh... :blush:
Oublies fread, travailles avec fgets.

<{POST_SNAPBACK}>

C'était pour savoir si le fichier est vide...

Je suis un peu perdue... :wacko:

En plus, j'ai dérivée entre temps pour arriver à ça:

$session = _AT_fopen($file,"r");
while (!feof($session)) {
$ligne = fgets($session, 1024);
if (!feof($session)) echo "$ligne<br>";
}
else {
echo "pas messages";
}
fclose($session);

Avec lequel j'ai bien les messages, mais toujours "pas messages"...

C'est pas facile!! :lol:

Posté (modifié)

resumons :

<?php

$file = './mon_fichier.txt'; //nom du fichier a traiter

$contenu = '';

if ( !empty($file) )

{

$fp = _AT_fopen($file, 'r');  //pointeur sur fichier

if ($fp) //fichier accessible en lecture

{

      // 1ere methode : une seule lecture

      $fsize = filesize($file); //taille du fichier

      $contenu = $fsize > 0 ? fread($fp, $fsize) : '';

      /*

      // 2e methode (equivalente): lecture par morceaux (ici, par exemple, 2048 octets)

      while ($buffer = fgets($fp, 2048))

          $contenu .= $buffer;

      // la longueur par defaut est de 1 ko ou 1024 octets

      // => fgets($fp) correspond a fgets($fp, 1024);

      // note: la concatenation de chaines volumineuses est deconseillee (->$contenu)

      */

      fclose ($fp);

    }

    else

    {

        // fichier inaccessible en lecture

    }

}

if ( empty($contenu) )

{

    echo "pas de commentaire";

}

else

{

    echo $contenu;

}

?>

Il existe d'autres methodes equivalentes. En voici une qui a le merite d'etre tres simple (!) a mettre en oeuvre ici dans le cadre d'un fichier .txt et tres facile a comprendre :

<?php

$file = './mon_fichier.txt'; //nom du fichier a traiter

//3e methode (PHP 4.3+, PHP 5) : file_get_contents

$content = _AT_file_get_contents($file); //recupere le contenu du fichier, s'il existe

if ( empty($contenu) )

{

    echo "pas de commentaire";

}

else

{

    echo $contenu;

}

?>

:)

Modifié par Dash
Posté

Merci Dash!! :flower:

J'ai essayé la première et la troisième méthode.

La troisième ne marche pas... ou du moins, je n'arrive pas à la faire marcher :blush:

C'est pas grave, la première marche très bien! Je la garde. :up:

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...