[php] lire dans un fichier

lire dans un fichier [php] - PHP - Programmation

Marsh Posté le 28-10-2007 à 03:47:52    

Bonjour,

 

voila je programme un script pour lire dans un fichier et effectuer des opérations sur les lignes de ce dernier.

 

voici ce que ça donne (j'ai bien simplifié bien sur :o)

 
Code :
  1. $nom_fichier = "liste";
  2. // Ouverture du fichier
  3. if ($TabFich = file($nom_fichier))
  4.  {
  5.  for($i = 0; $i < count($TabFich); $i++)
  6.  // 1ere operation : Le nombre de caractères
  7.  $nb_car = strlen($TabFich[$i]);
  8.  // 2eme op : on releve la premiere lettre
  9.  $prems_car = substr($TabFich[$i],0,1);
  10.  echo $TabFich[$i];
  11.  echo "<br>Nb caractères : $nb_car, premiere lettre : $prems_car";
  12.  }
 

J'aimerais savoir pourquoi j'obtiens le message d'erreur :

 

Notice: Undefined offset: 7 in c:\.... on line 11
Notice: Undefined offset: 7 in c:\.... on line 13

 

J'ai bien le nb de caractères qui s'affiche, mais la boucle s'arrête au premier mot relevé dans le fichier (d'ailleurs je constate qu'il commence par la derniere ligne huh) et qu'il ne releve par contre par la premiere lettre.

 

Ou est mon erreur de débutant ? :o

 

merci


Message édité par -tinost@r- le 28-10-2007 à 03:48:50
Reply

Marsh Posté le 28-10-2007 à 03:47:52   

Reply

Marsh Posté le 28-10-2007 à 08:58:10    

C'est un problème d'accolades.
 
Ce qui se passe, c'est que la ligne

for($i = 0; $i < count($TabFich); $i++)

fait tourner le compteur $i jusqu'à la fin, et après la valeur de $i pour les lignes suivantes

$nb_car = strlen($TabFich[$i]);
...

est déjà à la fin du fichier. Quand on dépasse les bornes, il n'y a plus de limite, dit un proverbe tibètain. D'où les messages d'erreur.  
 
La solution est :
 
1. Mettre une accolade ouvrante après l'instruction for()
2. Mettre une accolade fermante après le deuxième echo.
 
N.B. Cette erreur aurait été plus visible si les lignes avaient été bien indentées, car on aurait vu que la dernière accolade est celle du if, et non pas celle du for.


Message édité par olivthill le 28-10-2007 à 08:59:45
Reply

Marsh Posté le 28-10-2007 à 14:36:35    

Ah d'accord !

 

Je n'avais jamais vu la boucle For porter des accolades. Mais peut être que tous les exemples que j'ai pu voir ne fonctionnaient que sur une seule instruction, et qu'on peut s'autoriser à ne pas mettre d'accolade quand c'est court.

 

En tout cas, merci beaucoup, pour tes explications.


Message édité par -tinost@r- le 28-10-2007 à 14:36:53
Reply

Marsh Posté le 28-10-2007 à 15:56:23    

hmmm j'ai un autre probleme :/
 
Le relevé de la premiere lettre est bon.
 
Par contre le compte du nombre de caractère ne fonctionne pas.
 
voici le contenu du fichier liste

Code :
  1. ligne0
  2. ligne1


 
et voici ce qu'il me trouve :  
 

Code :
  1. Nb caractères : 8, premiere lettre : l
  2. Nb caractères : 6, premiere lettre : l


 
pour la derniere ligne, il m'en trouve donc bien 6. Mais pourquoi m'en trouve t-il 8 pour "ligne0".
(il n'y a pas d'espace, rien)
Y a un principe que je n'ai pas compris :o
 
merci :jap:

Reply

Marsh Posté le 28-10-2007 à 16:17:44    

La première ligne contient les caractères de retour à la ligne.
Il faut donc utiliser la fonction rtrim.


Message édité par tRanCe le 28-10-2007 à 16:18:23
Reply

Marsh Posté le 28-10-2007 à 16:19:48    

hey mais ça va pas la tête ?

Reply

Marsh Posté le 28-10-2007 à 16:28:28    

Faudra pas venir poser ta prochaine question ici, espèce de newbie  :ange:

Reply

Marsh Posté le 28-10-2007 à 16:29:13    

[:trance]

 

merci, ça marche :o


Message édité par -tinost@r- le 28-10-2007 à 16:29:22
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed