IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Filtre entrées/ sorties


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Points : 17
    Points
    17
    Par défaut Filtre entrées/ sorties
    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);
    }

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    char ** tch;
    tch est un pointeur de pointeur.
    Il est situé dans une structure.

    fifo_ch* fifo_ch_creer(unsigned int taille){
    fifo_ch_creer est une fonction qui retourne un pointeur de fifo_ch. Son nom indique que l'on va créer cette structure.

    char* new=malloc(strlen(s)+1);
    demande au système de la mémoire.
    Il en demande strlen(s)+1 octets.

    Voici le fichier un peu modifié pour qu'il compile:
    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
    70
    #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 (taille < 1) /* au moins une case */
            return NULL;
        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);
    }
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  3. #3
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut /!\
    Bonsoir,

    Des explications ont été fournies, mais à la lecture du code, il me paraît plus pertinent et important d'attirer votre attention sur le fait que le programme ; même après légère modification pour permettre la compilation, comporte des erreurs. Une fois compilée et exécutée, l'application crée des fuites mémoire en pagaille.

    À votre avis, qu'est ce qui se passe à cette ligne (66) while(fgets(ligne,TAILLE,f)!=NULL){ fifo_ch_ajouter(fifo,ligne); /* !!!*/ } et celle-ci (ligne 29 à 38) ?
    Qu'en est-il si l'on crée un fichier texte contenant des caractères crée de la manière suivante: "touch bigFile.txt && strings /* >> bigFile.txt" (sur ma machine, j'obtiens à l'aide de la commande "wc bigFile.txt"; "1402590 1467750 7864682 bigFile.txt" et "1402590" est le nombre de lignes) et que l'on exécute de cette manière"source_debug -8 bigFile.txt" ou "source_debug -2048 bigFile.txt " ? qu'obtient-on comme nombre de fuites mémoire ?​
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/05/2006, 11h41
  2. [Débutant]Procédure avec paramètres entrée / sortie
    Par jeromejanson dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2005, 08h30
  3. Débutant - Entrée/Sortie
    Par seigneur.viggen dans le forum Langage
    Réponses: 11
    Dernier message: 28/09/2005, 15h47
  4. Copie entrée-sortie
    Par Troell dans le forum C
    Réponses: 18
    Dernier message: 24/09/2005, 19h11
  5. Réponses: 11
    Dernier message: 13/10/2004, 00h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo