Bonsoir , je ne comprend pas un programme (j'ai mis en rouge tout ce que je n'arrive pas a comprendre )si quelqu'un pourrait m'aider a comprendre s'il vous plait merci d'avance:
Ce programme consiste a rejeter les n dernières lignes d'un fichier

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}