[ C vs Bash ] Détecter les lignes vides d'un fichier texte

Détecter les lignes vides d'un fichier texte [ C vs Bash ] - C - Programmation

Marsh Posté le 15-02-2005 à 21:14:57    

j'ai un pb : bash et c n'arrive pas à se mettre d'accord sur le nombre de lignes vides dans une fichier texte :
 

Code :
  1. int main() {
  2. FILE* fd = fopen("status","r" );
  3. char toto[150];
  4. int i=0;
  5. while (fgets(toto,150,fd))
  6.  if (toto[0] == '\n') i++;
  7. printf("nombre de paquets : %d\n",i);
  8. }


 
me renvoie : 10510
alors que :
grep ^$ status | wc -l
ne me renvoie que 10503 [:sisicaivrai]
 
c'est un fichier unix dont je n'ai pas étudié le contenu (trop gros)
 
vous savez de quoi cette différence peut venir ?


---------------
Non au projet de loi DADVSI ! (droits d'auteurs)
Reply

Marsh Posté le 15-02-2005 à 21:14:57   

Reply

Marsh Posté le 15-02-2005 à 21:16:40    

Quelques lignes d'une longueur de 149 caractères (ou un multiple de 149) ? Le fgets lit 149 caractères, il retourne une valeur différente de 0, il y a nouveau appel à fgets mais le premier caractère est un \n -> tu as compté une ligne vide de trop [:petrus75]

Reply

Marsh Posté le 15-02-2005 à 21:18:26    

ah pas bete ... normalement le fichier ne devrait pas avoir de lignes supérieur à 75 caractères, mais y-a p-t qq erreur
je vais augmenter la taille de qq zero pour voir [:joce]


---------------
Non au projet de loi DADVSI ! (droits d'auteurs)
Reply

Marsh Posté le 15-02-2005 à 21:19:30    

rah merci c'est ça [:romf]
't1, ils pourraient respecter la charte ce qui ont fait l'erreur :o


---------------
Non au projet de loi DADVSI ! (droits d'auteurs)
Reply

Marsh Posté le 15-02-2005 à 21:19:59    

utilises getline (gnu) si tu es sous linux

Reply

Marsh Posté le 15-02-2005 à 21:34:44    

manatane a écrit :

utilises getline (gnu) si tu es sous linux


 
merci, je connaissais pas, mais je préfère m'en tenir aux fonctions ansi  ;)


---------------
Non au projet de loi DADVSI ! (droits d'auteurs)
Reply

Marsh Posté le 15-02-2005 à 23:18:12    

udok a écrit :

j'ai un pb : bash et c n'arrive pas à se mettre d'accord sur le nombre de lignes vides dans une fichier texte :

Code :
  1. int main() {
  2. FILE* fd = fopen("status","r" );
  3. char toto[150];
  4. int i=0;
  5. while (fgets(toto,150,fd))
  6.  if (toto[0] == '\n') i++;
  7. printf("nombre de paquets : %d\n",i);
  8. }


me renvoie : 10510
alors que :
grep ^$ status | wc -l
ne me renvoie que 10503 [:sisicaivrai]
 
c'est un fichier unix dont je n'ai pas étudié le contenu (trop gros)
 
vous savez de quoi cette différence peut venir ?


Oui, le programme C est faux. Le '\n', c'est la fin de ligne...


#include <stdio.h>
 
int main (void)  
{
   FILE* fp = fopen ("status", "r" );
 
   if (fp != NULL)
   {      
      unsigned long count = 0;
      int c;
      while ((c = fgetc(fp)) != EOF)
      {
         if (c == '\n')
         {
            count++;
         }
      }
      fclose (fp), fp = NULL;
      printf ("nombre de paquets : %lu\n", count);
   }
   return 0;
}


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-02-2005 à 23:28:10    

je cherche pas à compter le nombre de \n dans le fichier
je cherche à compter le nombre de lignes vides  :o
 
sinon ça sert à quoi ton fp=NULL apres le fclose ?  :)


---------------
Non au projet de loi DADVSI ! (droits d'auteurs)
Reply

Marsh Posté le 16-02-2005 à 12:20:07    

udok a écrit :

je cherche pas à compter le nombre de \n dans le fichier
je cherche à compter le nombre de lignes vides  :o


Désolé, mal lu l'énoncé. Effectivement, le fgets() avec [0] devrait fonctionner si le buffer est suffisamment grand (sinon, le vider avec la boucle de fgetc() qui va bien)...

Citation :

sinon ça sert à quoi ton fp=NULL apres le fclose ?  :)


Dès qu'une ressource n'est plus valide, j'invalide le pointeur. Vieux reflexe...


Message édité par Emmanuel Delahaye le 16-02-2005 à 12:21:53

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-02-2005 à 13:14:29    

ok merci

Reply

Sujets relatifs:

Leave a Replay

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