Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2517 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°294948
LaMoR
Metal up your ass
Posté le 27-01-2003 à 17:13:10  profilanswer
 

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 ?

mood
Publicité
Posté le 27-01-2003 à 17:13:10  profilanswer
 

n°294974
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 27-01-2003 à 18:13:49  profilanswer
 

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
n°294977
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-01-2003 à 18:22:24  profilanswer
 


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)
n°294980
HelloWorld
Salut tout le monde!
Posté le 27-01-2003 à 18:38:01  profilanswer
 

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
n°294985
Taz
bisounours-codeur
Posté le 27-01-2003 à 19:00:58  profilanswer
 

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. }


 

n°294988
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 27-01-2003 à 19:04:18  profilanswer
 

++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?

n°294992
Taz
bisounours-codeur
Posté le 27-01-2003 à 19:13:54  profilanswer
 

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.

n°295001
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 19:28:48  profilanswer
 

++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
n°295006
Taz
bisounours-codeur
Posté le 27-01-2003 à 19:32:45  profilanswer
 

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!!!!!!!!!!

n°295008
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 19:38:43  profilanswer
 

++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
mood
Publicité
Posté le 27-01-2003 à 19:38:43  profilanswer
 

n°295012
LaMoR
Metal up your ass
Posté le 27-01-2003 à 19:45:44  profilanswer
 

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

n°295016
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 19:50:17  profilanswer
 

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
n°295017
Taz
bisounours-codeur
Posté le 27-01-2003 à 19:51:54  profilanswer
 

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
n°295022
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 19:58:46  profilanswer
 

++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
n°295024
Taz
bisounours-codeur
Posté le 27-01-2003 à 20:01:59  profilanswer
 

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

n°295026
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 20:03:32  profilanswer
 

++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
n°295213
Musaran
Cerveaulté
Posté le 28-01-2003 à 06:43:15  profilanswer
 

++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
n°295227
LetoII
Le dormeur doit se réveiller
Posté le 28-01-2003 à 07:58:09  profilanswer
 

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
n°295377
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-01-2003 à 13:27:35  profilanswer
 

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)
n°295396
LaMoR
Metal up your ass
Posté le 28-01-2003 à 13:53:58  profilanswer
 

: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

n°295435
Taz
bisounours-codeur
Posté le 28-01-2003 à 15:08:00  profilanswer
 

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" ;) )

n°295456
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-01-2003 à 15:23:51  profilanswer
 

++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)
n°295585
LetoII
Le dormeur doit se réveiller
Posté le 28-01-2003 à 17:58:31  profilanswer
 

++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
n°295609
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-01-2003 à 18:17:34  profilanswer
 

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)
n°295917
Musaran
Cerveaulté
Posté le 29-01-2003 à 00:41:32  profilanswer
 

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
n°295964
LetoII
Le dormeur doit se réveiller
Posté le 29-01-2003 à 07:23:31  profilanswer
 

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
n°295967
Cherrytree
cn=?
Posté le 29-01-2003 à 07:35:32  profilanswer
 

ç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
n°295970
LetoII
Le dormeur doit se réveiller
Posté le 29-01-2003 à 07:41:00  profilanswer
 

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
n°295972
Cherrytree
cn=?
Posté le 29-01-2003 à 07:42:55  profilanswer
 

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


---------------
Le site de ma maman
n°295974
LetoII
Le dormeur doit se réveiller
Posté le 29-01-2003 à 07:43:58  profilanswer
 


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


---------------
Le Tyran
n°295978
Cherrytree
cn=?
Posté le 29-01-2003 à 07:53:08  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Excel : Récupérer un fichier txt sans format et le formater sous Excelmon programme qui lit dans un fichier .ase ne se termine jamais !
formulaire :--> upload d'un fichier image[C++ API W32] Gestion du retour de ligne dans une edit box
[batch] Lire un fichier et extraire une ligneImport de données au format access (fichier mdb) par un utilisateur
Copie d'un fichier dans un tableau a 2 entrées de stringDécompiler une fichier exe ?
comment inclure une classe d'un fichier JAR 
Plus de sujets relatifs à : [C, C++] Nb de ligne d'un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR