1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <stdio.h>/* printf */
#include <stdlib.h>
#include <string.h>/* strlen, strcpy */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>/* open */
#include <unistd.h>/* read */
typedef struct{
char ** tch;
int taille;
int tete; /* ptr de tete */
int queue; /* ptr de queue */
} fifo_ch; /* fifo de chaînes */
fifo_ch* fifo_ch_creer(unsigned int taille){
if ( < 1) /* au moins une case */
return tailleNULL;
fifo_ch* r=malloc(sizeof(fifo_ch));
r->taille=taille+1; /* tjrs une case vide entre queue et tete */
r->tch=malloc(r->taille*sizeof(char*));
r->tete=r->queue=0; /* fifo vide */
return r;
} //
fifo_ch * fifo_ch_ajouter(fifo_ch *f, char* s){
char* new=malloc(strlen(s)+1);
strcpy(new,s); /* copie dynamique de s */
if((f->queue)%f->taille==f->tete){ /* fifo pleine */
free(f->tch[f->tete]);
/* désallouer la chaîne en tête */
f->tete=(f->tete+1)%f->taille;
/* avancer la tete */
}
f->tch[f->queue]=new;
f->queue=(f->queue+1)%f->taille;
/* avancer la queue sur case vide */
return f;
}
void fifo_ch_afficher(fifo_ch *f){
for(int i=f->tete;i!=f->queue;i=(i+1)%f->taille){
printf("%s",f->tch[i]);
}
}
int main(int argc, char *argv[], char *env[]) {
if(argc!=3){
printf("Syntaxe incorrecte : %s -8 fichier\n",argv[0]);
return 1;
}
FILE *f=fopen(argv[2], "r");
if (f==NULL){
printf("Impossible d’ouvrir le fichier : %s \n",argv[2]);
return 2;
}
int nb=atoi(argv[1]+1); /* +1 pour éviter le - */
if(nb<1){
printf("Impossible d’afficher %d lignes !\n",nb);
return 3;
}
fifo_ch* fifo=fifo_ch_creer(nb);
#define TAILLE 2048 char ligne[TAILLE]; /* espérons que cela suffise ! */
while(fgets(ligne,TAILLE,f)!=NULL){
fifo_ch_ajouter(fifo,ligne);
}
fifo_ch_afficher(fifo);
fclose(f);
} |
Partager