Vérifier la derniere ligne d'un fichier

Petit nouveau ! | 6 Messages

20 juil. 2009, 14:08

Bonjour,

Jespere etre dans la bonne section. J'ai un souci que je n'arrive pas a résoudre. Je voudrais vérifier la présence de deux retours a la ligne a la fin de mon fichier.

En gros j'ai essayé de faire un fseek(fichier, -2, SEEK_END); et derriere un fgets(fichier) et je compare le resultat a '\n\n'. Le soucis c'est que cela ne fonctionne pas et je suppose que cela vient du fait que les \n soient des caracteres speciaux.

Quelqu'un aurait une idée ou une piste pour moi?

Désolé pour les accents je suis sur un clavier anglais et je n'ai trouvé que la touche pour l'accent aigue.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2009, 16:32

Deux petites choses... En php, pour être interprétés correctement les \n doivent être placés entre guillemets ("\n") et pas entre apostrophes ('\n') ...

L'autre chose, c'est que fgets() te retourne la ligne courante, tu ne peux donc pas y trouver deux retours à la ligne, puisqu'il s'agirait dans ce cas de deux lignes... en gros, il faudrait faire appel deux fois à fgets, et vérifier si chacun te retourne "\n" :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

21 juil. 2009, 12:06

Merci de ses explications claires et précises mais cela ne fonctionne pas.
$fd = @fopen($file,"a+");
if (!$fd) die("We can't read the file.");
fseek($fd,-2,SEEK_END);
$before_last_ligne=fgets($fd, 4096);
fseek($fd,-1,SEEK_END);
$last_ligne=fgets($fd, 4096);
if ($before_last_ligne == "\n" && $last_ligne == "\n"){
    $return_treatment['lastline'] = 'OK';        
}else{
    $return_treatment['lastline'] = 'NON';
}
fseek($fd,0,SEEK_SET);
Le script me renvoit toujours NON... Je ne pense pas etre loin de la solution si?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 juil. 2009, 12:25

Si tu es sous windows, les retours à la ligne n'apparaissent pas simplement comme des "\n", mais comme des "\r\n". Il y a en effet un retour à la ligne + une nouvelle ligne (contrairement à unix ou la nouvelle ligne "\n" suffit).

Du coup, ton fseek avec l'offset -2 doit te ramener non pas sur la ligne précédente, mais sur le "\r", rendant par conséquent ton test faux. Tu peux essayer de faire un offset de -3 octets au lieu de -2, mais cela ne fonctionnera que pour windows (peut être à compléter d'un test pour déterminer sur quel os ton script se trouve ?)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...