Un peu d'aide sur un mélange de cat/tail

Un peu d'aide sur un mélange de cat/tail - C - Programmation

Marsh Posté le 21-03-2004 à 00:30:04    

Il n'y a pas quelqu'un qui voudrait m'aider? je suis entrain de virer complètement fou. J'ai 18 début de programme qui marche pas  :pfff:  
 
Ca fait 1 semaine que je cherche la solution et j'y arrive pas. Pourtant c'est pas que j'ai pas essayé!  :cry:  
 
Sur Linux,
Voilà, j'essai de faire comme un "cat" sous Unix mélangé avec un "tail". Autrement dit, ca affiche le nombres de lignes demandées passées en paramètres, dans tous les fichiers passé en paramètres. Si aucun paramètre n'est passé, il affiche que les 10 dernières lignes.  
 
La seule chose que j'ai réussi à faire, c'est d'afficher les lignes entres le début et la fin.  
 

Code :
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main(int argc,char *argv[])
  4. {
  5. FILE *f;
  6. int d,f,c=0;
  7. char l[100000];
  8. if (argc!=4)
  9. {
  10. printf("Usage: %s <debut> <fin> <fichier>\n",argv[0]);
  11. return 1;
  12. }
  13. if ((f=fopen(argv[3],"r" ))==NULL)
  14. {
  15. perror("fopen()" );
  16. return 1;}
  17. sscanf(argv[1],"%d",&d);
  18. sscanf(argv[2],"%d",&f);
  19. while (fgets(l,100000,f))
  20. {
  21. c++;
  22. if ((d<=c)&&(c<=f)) fputs(l,stdout);
  23. if (c>f) break;
  24. }
  25. fclose(f);
  26. return 0;
  27. }


 

Reply

Marsh Posté le 21-03-2004 à 00:30:04   

Reply

Marsh Posté le 21-03-2004 à 00:41:03    

et quoi ?
 
man getline déjà

Reply

Marsh Posté le 21-03-2004 à 00:46:38    

et deux aspirine
 
je connaissais pas cette "fonction"  
 
merci ca m'aide un peu

Reply

Marsh Posté le 21-03-2004 à 06:32:39    

Je comprend pourquoi pourquoi tu dit faire un mélange de cat et tail... Que fait ton programme que tail ne fait pas ? Parce que tel que tu le décrit, c'est tail...

Reply

Marsh Posté le 21-03-2004 à 07:49:55    

Je crois que tail ne prend qu'un fichier en paramètre, tandis que cat en "concatene" plusieurs, donc ca serait la fonction tail qui affiche un nombre n de ligne dans plusieurs fichier

Reply

Marsh Posté le 21-03-2004 à 21:04:07    

Ben non justement, tail prend plusieurs fichiers. « tail -q -n <num> <file1> <file2> ... » fait exactement ce que tu veux.

Reply

Marsh Posté le 22-03-2004 à 00:43:04    

Pour ceux que ca intéressent, j'ai réussi à faire quelque chose...c'est laid et mal coder mais ca donne exactement le résultat voulu
 
reste qu'a mettre une gestion d'erreur que j'arrive pas, mais bon ca c'est un détail.
 
genre ./tail -4 fichier1 fichier 2 -->ok
./tail fichier --> ok 10 lignes par défaut
./tail 4 fichier1 fichier2 --> Erreur, usage ./tail -n <fichier>
 

Code :
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. int main(int argc, char* argv[])
  4. {
  5. int k;
  6. int j = -10;
  7. int t = -10;
  8. char* nomsFichiers;
  9. FILE* streamin;
  10. for (k = 1; k < argc; k++)
  11. {
  12.  if (argv[k][0] == '-')
  13.  {
  14.   t = atoi(argv[k]+1);
  15.   if (t == 0)
  16.   {
  17.    printf("Parametres incorrects"\n" );
  18.   }
  19.   t = -t;
  20.   j = t;
  21.  }
  22.  else
  23.  {
  24.   printf("\nDernieres %d lignes \n", -t);
  25.   nomsFichiers = argv[k];
  26.   if ((streamin = fopen(nomsFichiers, "r" )) == NULL)
  27.   {
  28.    printf("Impossible d'ouvrir le fichier: %s. \n", nomsFichiers);
  29.    return 2;
  30.   }
  31.   printf("du fichier %s \n\n", nomsFichiers);
  32.   int compteLignes = 1;
  33.   int totalLignes = 0;
  34.   int debutLigne = 0;
  35.   int ch;
  36.   while ((ch = getc(streamin)) !=EOF)
  37.   {
  38.    if ((ch == '\n')
  39.    {
  40.     totalLignes++;
  41.    }
  42.   }
  43.   if (j > 0)
  44.   {
  45.    debutLigne = 1+j;
  46.   }
  47.   else
  48.   {
  49.    debutLigne = totalLignes +j+2;
  50.   }
  51.   if ((streamin = fopen(nomsFichiers, "r" )) == NULL)
  52.   {
  53.    printf("Impossible d'ouvrir le fichier: %s.\n", nomsFichiers);
  54.    return 2;
  55.   }
  56.   while ((ch = getc(streamin)) !=EOF)
  57.   {
  58.    if (compteLignes >= debutLigne-1)
  59.    {
  60.     printf("%c", ch);
  61.    }
  62.    if (ch == '\n')
  63.    {
  64.     compteLignes++;
  65.    }
  66.   }
  67.  }
  68. }
  69. fclose (streamin);
  70. return 0;
  71. }

Reply

Sujets relatifs:

Leave a Replay

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