[C, C++] Nb de ligne d'un fichier

Nb de ligne d'un fichier [C, C++] - C++ - Programmation

Marsh Posté le 27-01-2003 à 17:13:10    

Bonjour :)
 
Je sais k'il existe une fonction ki recupere le nb de carcteres d'une ligne : "strlen"
mais par contre existe-il une fonction ki recupere le nb de lignes d'un fichier ?

Reply

Marsh Posté le 27-01-2003 à 17:13:10   

Reply

Marsh Posté le 27-01-2003 à 18:13:49    

Par exemple:), un peu bourrin.

Code :
  1. int main()
  2. {
  3.    int j=0;
  4.    FILE *p;
  5.      
  6.    char c;
  7.    p=fopen("path+nom_du_fichier", "r" );
  8.    while(!feof(p))
  9.    {
  10.       c=fgetc(p);
  11.       if(c== '\n')
  12.          j++;
  13.    }
  14.    close(p);
  15.    printf("%d\n", j);
  16.    return(0);
  17. }


 
Mais rien ne t'empêche de lire le fichier d'un coup dans une grande chaine et de rechercher '\n' dans celle ci...


Message édité par fodger le 27-01-2003 à 19:03:40
Reply

Marsh Posté le 27-01-2003 à 18:22:24    


tu ouvres ton fichier en lecture
ligne <- 0
lire 1er caractère
tant que (not EOF)
   si caractère = '\n'
      ligne += 1
   fin si
   lire caractère suivant
fin tant que


Message édité par Harkonnen le 27-01-2003 à 18:24:05

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-01-2003 à 18:38:01    

manquerait un +1 quelque part. (si la derniere ligne du fichier ne se termine pas par un '\n';)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-01-2003 à 19:00:58    

putain mais arretez avec vos EOF: on fait pas comme ça en C!!!!!
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. FILE *file;
  6. if((file=fopen("nom_du_fichier", "r" )) == NULL)
  7. {
  8.   return EXIT_FAILURE;
  9. }
  10. int c;
  11. usnigned nl=0;
  12. while((c=fgetc(file)) != EOF)
  13. {
  14.   if(c == '\n')
  15.   {
  16.      ++nl;
  17.   }
  18. }
  19. fclose(file);
  20. printf("nombres de lignes  = %u\n", nl);
  21. return EXIT_SUCCESS;
  22. }


 

Reply

Marsh Posté le 27-01-2003 à 19:04:18    

++Taz a écrit :

putain mais arretez avec vos EOF: on fait pas comme ça en C!!!!!
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. FILE *file;
  6. if((file=fopen("nom_du_fichier", "r" )) == NULL)
  7. {
  8.   return EXIT_FAILURE;
  9. }
  10. int c;
  11. usnigned nl=0;
  12. while((c=fgetc(file)) != EOF)
  13. {
  14.   if(c == '\n')
  15.   {
  16.      ++nl;
  17.   }
  18. }
  19. fclose(file);
  20. printf("nombres de lignes  = %u\n", nl);
  21. return EXIT_SUCCESS;
  22. }


 
 


 
mais keskidi?

Reply

Marsh Posté le 27-01-2003 à 19:13:54    

regarde un topic c++ récent (lignes de ficheirs, je sais p^lus quoi).
 
en C, on ne se sert JAMAIS de feof pour détecter la fin de ficheir lors d'un parcours: on s'en sert uniquement pour caractèrisée les erreurs qui peuvent survenir.

Reply

Marsh Posté le 27-01-2003 à 19:28:48    

++Taz a écrit :

regarde un topic c++ récent (lignes de ficheirs, je sais p^lus quoi).
 
en C, on ne se sert JAMAIS de feof pour détecter la fin de ficheir lors d'un parcours: on s'en sert uniquement pour caractèrisée les erreurs qui peuvent survenir.


 
Et pourquoi pas, après tout? Je vois pas intraséquement de raison pour pas le faire.
 
PS: ouai c encore moi, mais je suis très curieux de connaitre le fond de ton traumatisme avec EOF :D Je suis tjrs avide d'en apprendre plus :D


---------------
Le Tyran
Reply

Marsh Posté le 27-01-2003 à 19:32:45    

PARCE QU EN C EOF NE SURVIENT PAS QUAND ON ATTEIND LA FIN DU FICHIER (POINTEUR POSITIONNE APRES LA DERNIERE POSITION VALIDE) MAIS A LA PREMIERE LECTURE INFRUCTUEUSE!!!!!!!!!!

Reply

Marsh Posté le 27-01-2003 à 19:38:43    

++Taz a écrit :

PARCE QU EN C EOF NE SURVIENT PAS QUAND ON ATTEIND LA FIN DU FICHIER (POINTEUR POSITIONNE APRES LA DERNIERE POSITION VALIDE) MAIS A LA PREMIERE LECTURE INFRUCTUEUSE!!!!!!!!!!


 
Alors je te renvoie à la doc de feof:  
 
"feof retourne une valeur non nulle si l'indicateur de fin de fichier du flot stream est positionné."
 
Tiré de Le langage C par B.W. Kernighan et D.M. Ritchie edission de 1995
 
Bon alors sauf si je sais pas lire ou que je suis bien neuneu ( j'en doute mais bon c peut être un sursaut d'orgueuil on sait pas) feof renvoie un truc vrai si on a atteint la fin du fichier lors de la dernière opération de lecture. Non?


Message édité par LetoII le 27-01-2003 à 19:39:16

---------------
Le Tyran
Reply

Marsh Posté le 27-01-2003 à 19:38:43   

Reply

Marsh Posté le 27-01-2003 à 19:45:44    

faut pas s'engueuler les gars  :hello:  
 
en tout cas merci  :jap: , demain je testerais tt ca, car c un truc ke je fais au boulot et j'evite de m'y remettre le soir  :D

Reply

Marsh Posté le 27-01-2003 à 19:50:17    

LaMoR a écrit :

faut pas s'engueuler les gars  :hello:  
 
en tout cas merci  :jap: , demain je testerais tt ca, car c un truc ke je fais au boulot et j'evite de m'y remettre le soir  :D  


 
On s'engueule pas (pas encore  :whistle: ), on échange juste des points de vues. J'aime bien comprendre le point de vue des autres, ça m'aide à m'améliorer.


---------------
Le Tyran
Reply

Marsh Posté le 27-01-2003 à 19:51:54    

t'es neuneu mais feof renvoie effectivemnt l'etat du flag et comme tu le dis.
 
fais moi confiance! le K&R est certes flou, mais j'ai raison
 

Code :
  1. while(!feof(p))
  2.   {
  3.      c=fgetc(p); /* la fin de fichier est atteinte ici: d'ailleurs EOF ne peut etre contenu dans unc har, d'ou le proto int fgetc(FILE *). c'est a cet endroit precis si EOF est renvoyé que la fin de fichier a été atteinte. */
  4.      if(c== '\n')
  5.         j++;
  6.   }


 
fais moi confiance, je t'assure  ;)
 
edit: le K&R ne contient à mon souvenir aucun exemple d'utilisation de feof, pourtant beaucoup d'exercice traitent des fichiers, notemment wc


Message édité par Taz le 27-01-2003 à 19:56:50
Reply

Marsh Posté le 27-01-2003 à 19:58:46    

++Taz a écrit :

t'es neuneu mais feof renvoie effectivemnt l'etat du flag et comme tu le dis.
 
fais moi confiance! le K&R est certes flou, mais j'ai raison
 

Code :
  1. while(!feof(p))
  2.   {
  3.      c=fgetc(p); /* la fin de fichier est atteinte ici: d'ailleurs EOF ne peut etre contenu dans unc har, d'ou le proto int fgetc(FILE *). c'est a cet endroit precis si EOF est renvoyé que la fin de fichier a été atteinte. */
  4.      if(c== '\n')
  5.         j++;
  6.   }


 
fais moi confiance, je t'assure  ;)  


 
J'aime pas les réponses comme ça. Et crois moi quand j'utilise feof je sais exactement ce que je fais (bon le dernier exemple en date en est pas trop la preuve, faut que j'arréte de tapper des codes àa la va vite pour répondre).
 
EDIT:
 
Pour conclure: effectivement si l'on souhaite être exostif dans le traitement d'erreur mieu vaut tester la valeur de retour de fgetc (par exemple).


Message édité par LetoII le 27-01-2003 à 20:01:11

---------------
Le Tyran
Reply

Marsh Posté le 27-01-2003 à 20:01:59    

bon, c'est pour vous. faudra pas venir se plaindre apres. je sors

Reply

Marsh Posté le 27-01-2003 à 20:03:32    

++Taz a écrit :

bon, c'est pour vous. faudra pas venir se plaindre apres. je sors


 
Meu non t'enva pas c bien de signaler au gens qu'ils faut qu'ils fassent gaffe à ce qu'ils font.


---------------
Le Tyran
Reply

Marsh Posté le 28-01-2003 à 06:43:15    

++Taza écrit a écrit :

putain mais arretez avec vos EOF: on fait pas comme ça en C!!!!!


Ouaip.
 

LetoII a écrit a écrit :

Alors je te renvoie à la doc de feof:  
 
"feof retourne une valeur non nulle si l'indicateur de fin de fichier du flot stream est positionné."


Qui n'est positionné que quand une lecture à essayé d'aller au-delà de la fin du fichier.
 
Un feof() qui serait vrai dès le dernier octet lu ne serait d'aucune utilité pour les lectures de plus d'un octet:

Code :
  1. //vrai s'il n'y a plus de données à lire
  2. bool feofpascal(FILE* fd){
  3. long savepos= ftell(fd);
  4. fseek(fd, 0, SEEK_END); //aller en fin
  5. long endpos= ftell(fd);
  6. fseek(fd, savepos, SEEK_SET); //rétablir la position
  7. return savepos==endpos;
  8. }
  9. while( ! feofpascal(f))
  10. fread(buf,2,1,f); //peut échouer s'il reste 1 octet, mais pas 2


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 28-01-2003 à 07:58:09    

Musaran a écrit :

Ouaip.
 
Qui n'est positionné que quand une lecture à essayé d'aller au-delà de la fin du fichier.
 
 


 
Jamais dit le contraire, même si j'ai fait preuve d'un peu de movaise fois(juste un peu) je crois pas avoir déformé la vérité.
 
EDIT: Ouai si en fait en relisant mon post je me suis rendu compte que j'ai pas trop été clair sur ce point, désolé  :jap:


Message édité par LetoII le 28-01-2003 à 08:03:06

---------------
Le Tyran
Reply

Marsh Posté le 28-01-2003 à 13:27:35    

pourquoi ai-je la désagréable impression d'être à l'origine de tout ce bordel ? [:ddr555]
 
Taz > ton explication est certes claire et bienvenue ! ceci dit, inutile de capser et de t'énerver, ça ne sert à rien du tout ! on connait tous ton penchant fort louable de nous encourager à écrire du code C/C++ standard, mais essaie quand même d'y mettre les formes.
 
je te renvoie aux réponses de Musaran, qui allie tact, diplomatie et compétences techniques indéniables, dans tous ses topics.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-01-2003 à 13:53:58    

:jap: Merci ;)
 
j'ai utiliser un bout du code a Taz, tous ca pour m'appercevoir ke ca ne servait a rien :( (ca marchait pourtant bien).
 
en fait j'ai fait avec la taille du fichier plutot k'avec les lignes..  :D  
 
en tt cas merci encore

Reply

Marsh Posté le 28-01-2003 à 15:08:00    

je me suis un peu excité parce que ça fait le troisième topic ces derniers jours ou je soulevent le meme mauvais emploi de feof en C, car cette fonction diffère de celle du Pascal. merci musaran
 
sur cet exemple précis, effectivement, cela n'a pas d'incidence, s'il n'y a pas d'erreur lors de la lecture du fichier. mais dans tous les cas, il est beaucoup plus sure de tester les retours des fonctions E/S afin de détecter toutes les erreurs possibles. en effet fgetc peut renvoyer EOF sans que la feof soit vrai. donc prudence.
 
essayer de prendre des bonnes habitudes. (si vous n'etes toujours pas convaincus, regarder le nombre de topics du genre "lecture de fichier, derniere ligne en double" ;) )

Reply

Marsh Posté le 28-01-2003 à 15:23:51    

++Taz a écrit :

essayer de prendre des bonnes habitudes. (si vous n'etes toujours pas convaincus, regarder le nombre de topics du genre "lecture de fichier, derniere ligne en double" ;) )


le pire, c'est que dans mon algo, j'ai mis (!EOF) parce que j'avais la flemme de taper "tant que la fin du fichier n'est pas atteinte" :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-01-2003 à 17:58:31    

++Taz a écrit :

je me suis un peu excité parce que ça fait le troisième topic ces derniers jours ou je soulevent le meme mauvais emploi de feof en C, car cette fonction diffère de celle du Pascal. merci musaran
 
sur cet exemple précis, effectivement, cela n'a pas d'incidence, s'il n'y a pas d'erreur lors de la lecture du fichier. mais dans tous les cas, il est beaucoup plus sure de tester les retours des fonctions E/S afin de détecter toutes les erreurs possibles. en effet fgetc peut renvoyer EOF sans que la feof soit vrai. donc prudence.
 
essayer de prendre des bonnes habitudes. (si vous n'etes toujours pas convaincus, regarder le nombre de topics du genre "lecture de fichier, derniere ligne en double" ;) )


 
Rien a ajouté si ce n'est que je suis entièrement d'accord avec toi, comme quoi quand on s'explique clairment :D


---------------
Le Tyran
Reply

Marsh Posté le 28-01-2003 à 18:17:34    

putain, je viens de relire le topic, et je me suis rendu compte que c'est pas après moi que Taz en avait, mais après Fodger !! :ouch:
 
le pire c que mon algo finalement ressemble bcp a ce que propose Taz [:yaisse2]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-01-2003 à 00:41:32    

Harkonnen a écrit :

pourquoi ai-je la désagréable impression d'être à l'origine de tout ce bordel ? [:ddr555]

Non, c'est C le fautif de ne pas être clair.
Pascal aussi d'ailleurs tiens.
 
La doc dit que "fseek(fd, 0, SEEK_END)" envoie à la fin du fichier.
J'ai dû faire un test pour déterminer que cela veut dire: [b]après[b] le dernier octet du fichier.
 

Citation :

je te renvoie aux réponses de Musaran, qui allie tact, diplomatie et compétences techniques indéniables, dans tous ses topics.

Complimenter ne suffit pas, il faut aussi se prosterner. :whistle:
(j'y ai pris goût maintenant) :o


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 29-01-2003 à 07:23:31    

Musaran a écrit :


La doc dit que "fseek(fd, 0, SEEK_END)" envoie à la fin du fichier.
J'ai dû faire un test pour déterminer que cela veut dire: [b]après[b] le dernier octet du fichier.


Ha ouai... Je m'étais jamais posé la question remarque :D

Musaran a écrit :


Citation :

je te renvoie aux réponses de Musaran, qui allie tact, diplomatie et compétences techniques indéniables, dans tous ses topics.

Complimenter ne suffit pas, il faut aussi se prosterner. :whistle:
(j'y ai pris goût maintenant) :o

:lol:  [:grinking]


---------------
Le Tyran
Reply

Marsh Posté le 29-01-2003 à 07:35:32    

ça doit être parce que c'est tôt, mais j'ai pas compris pourquoi feof est dangereux. Je suis curieux de nature et j'aimerais comprendre. Mais ne me tapez pas.


---------------
Le site de ma maman
Reply

Marsh Posté le 29-01-2003 à 07:41:00    

Cherrytree a écrit :

ça doit être parce que c'est tôt, mais j'ai pas compris pourquoi feof est dangereux. Je suis curieux de nature et j'aimerais comprendre. Mais ne me tapez pas.


 
C pas que c dangereux c que tu teste qu'une des raison qui ferait que la lecture échoue grace à cette fonction. Si tu prend getc par exemple elle te renvoie EOF quand une erreur survient lors de la lecture où si tu as essayé de lire après le dernier caractère. Si tu ne vérifie pas la valeur de retour de getc et que tu te contante de tester la valeur de retour de feof tu ne peux détecter que le cas où tu lit après le dernier octet du fichier (cas le plus fréquant au demeurant). Si tu teste la valeur de retour de getc tu peux utiliser  feof pour savoir si l'erreur vient du fait que tu as dépassé la taille du fichier et si non y a une fonction pour envoyer un message qualifiant l'ereur (tu peux aussi jeter un coup d'oeil à la variable erorno).
 
Ai-je bien résumé la chose?


---------------
Le Tyran
Reply

Marsh Posté le 29-01-2003 à 07:42:55    

J'ai compris ! \o/ Merci http://yozakura.free.fr/hfr/letoii.gif


---------------
Le site de ma maman
Reply

Marsh Posté le 29-01-2003 à 07:43:58    


 
 
Avant de me remercier attand de voir si j'ai pas dit de conneries :D
 
 
 [:letoii]


---------------
Le Tyran
Reply

Marsh Posté le 29-01-2003 à 07:53:08    

LetoII a écrit :


 
 
Avant de me remercier attand de voir si j'ai pas dit de conneries :D
 
 
 [:letoii]  


Si j'ai compris, c'est que ce n'est sans doute pas faux. :o


---------------
Le site de ma maman
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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