OVH Cloud OVH Cloud

Fin de tableau

4 réponses
Avatar
Le Fou
Salut,

[Débutant en PHP]
J'ai un fichier texte qui s'appelle "liste_messages.txt" et qui contient :
message_1.txt
message_2.txt

sans espace après chaque ligne et sans retour chariot après la dernière
ligne.

J'ai aussi 2 fichiers texte dont les noms sont ceux contenus dans le fichier
précédent.
Le but du jeu :
- Lire le fichier "liste_messages.txt", mettre ses lignes dans un tableau,
trier le tableau en ordre inverse et récupérer ensuite la valeur de chaque
ligne du tableau (donc le nom du message) pour aller lire et afficher ce
message.
Voici mon code :

<?php
$listMsg = file("news/liste_messages.txt");
arsort ($listMsg);
while ( list( $numeroLigne, $nomMsg ) = each( $listMsg ) ) {
echo "<B>Ligne $numeroLigne:</B> $nomMsg" . "toto<br>\n";
$fichier = fopen("news/$nomMsg", "r");
$titreMsg = fgets($fichier, 4096);
$dateMsg = fgets($fichier, 4096);
/ / à ce niveau je ne suis pas à la fin du fichier mais je ne veux pas
afficher la suite
echo "<h2>$titreMsg</h2>\n";
echo "<p class=\"date\">$dateMsg</p>\n";
fclose ($fichier);
}
?>

Le programme m'affiche bien :

Ligne 1: message_2.txttoto
- Le titre
- La date
Ligne 0: message_1.txt toto

et ensuite :
Warning: fopen(news/message_1.txt ) [function.fopen]: failed to open stream:
...

Parceque si vous remarquez bien, il y a un caractère à la fin du texte
"message_1.txt", on le voit bien quand j'écris "toto" derrière, qui est
censé être collé.
Quel est ce caractère ?
- Un espace (qui vient d'où) ?
- Une marque de fin de tableau ?
- Une marque de fin de fichier ?
Comment l'enlever pour retrouver le nom exact du fichier à ouvrir ?
Merci.

--
A'tchao

Le Fou
http://gloupclub.free.fr/
http://www.ffessm-cd84.com/
http://ehiller.club.fr/

4 réponses

Avatar
Olivier Miakinen


$fichier = fopen("news/$nomMsg", "r");
$titreMsg = fgets($fichier, 4096);
$dateMsg = fgets($fichier, 4096);

Ligne 1: message_2.txttoto
Ligne 0: message_1.txt toto

Parceque si vous remarquez bien, il y a un caractère à la fin du texte
"message_1.txt", on le voit bien quand j'écris "toto" derrière, qui est
censé être collé.
Quel est ce caractère ?
- Un espace (qui vient d'où) ?
- Une marque de fin de tableau ?
- Une marque de fin de fichier ?


C'est le caractère newline (n), ainsi qu'on peut le comprendre si on
lit la doc en anglais, mais qui est incompréhensible dans la version
française.
http://fr2.php.net/manual/en/function.fgets.php
http://fr2.php.net/manual/fr/function.fgets.php

Comment l'enlever pour retrouver le nom exact du fichier à ouvrir ?


Par exemple :
$fichier = fopen("news/$nomMsg", "r");
$titreMsg = rtrim(fgets($fichier));
$dateMsg = rtrim(fgets($fichier));
fclose ($fichier);

Tu peux faire aussi, en une seule ligne :
list($titreMsg, $dateMsg) explode("n", file_get_contents("news/$nomMsg"));

Avatar
davel_x

Parceque si vous remarquez bien, il y a un caractère à la fin du texte
"message_1.txt", on le voit bien quand j'écris "toto" derrière, qui est
censé être collé.
Quel est ce caractère ?
- Un espace (qui vient d'où) ?
- Une marque de fin de tableau ?
- Une marque de fin de fichier ?
Comment l'enlever pour retrouver le nom exact du fichier à ouvrir ?
Merci.


http://fr2.php.net/trim
ça devrait aider, même si ça n'explique pas le pourquoi du comment. :)


--
**davel**
http://www.davel.fr/blog/

Avatar
Le Fou
Olivier Miakinen a écrit :
Quel est ce caractère ?
- Un espace (qui vient d'où) ?
- Une marque de fin de tableau ?
- Une marque de fin de fichier ?


C'est le caractère newline (n),


C'est effectivement le caractère n, code ascii 0A (vu en utilisant bin2hex)


Comment l'enlever pour retrouver le nom exact du fichier à ouvrir ?


Par exemple :
$fichier = fopen("news/$nomMsg", "r");
$titreMsg = rtrim(fgets($fichier));
$dateMsg = rtrim(fgets($fichier));
fclose ($fichier);


Le problème c'est que ce n'est pas là qu'il me gène mais ici :
$listMsg = file("news/liste_messages.txt");
arsort ($listMsg);
while ( list( $numeroLigne, $nomMsg ) = each( $listMsg ) ) {...

C'est $nomMsg qui comporte ce caractère mais uniquement en lisant la
dernière ligne, alors que le fichier "liste_messages.txt" contient plusieurs
lignes (donc avec un n).

Mais peu importe, comme toi et davel_x me l'avez suggéré, "trim" est
parfaitement adapté pour régler ce problème.
Je n'y avais pas pensé car dans la doc que j'avais, qui datait de 2001, il
était marqué :
"trim -- Supprime les espaces "en début et fin de chaîne"
et on n'y parlait pas "d'autres caractères"... C'est ballot, hein ? ;-)

Merci à vous.

--
A'tchao

Le Fou
http://gloupclub.free.fr/
http://www.ffessm-cd84.com/
http://ehiller.club.fr/


Avatar
Le Fou
davel_x a écrit :

http://fr2.php.net/trim
ça devrait aider, même si ça n'explique pas le pourquoi du comment. :)


Pile-poil ! Merci.

--
A'tchao

Le Fou
http://gloupclub.free.fr/
http://www.ffessm-cd84.com/
http://ehiller.club.fr/