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 :

Compréhension de code, fonction buf() et strcle()


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Compréhension de code, fonction buf() et strcle()
    Bonjour,

    J'ai trouvé ce code sur le web et je cherche à le comprendre .

    Je n'ai pas compris à quoi sevent les fonctions void buf() et void strcle(char* str).

    Si quelqu’un peux m'aider a comprendre le code, merci.

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    #define TAILLE 5000
     
    typedef struct fichier
    {
        FILE* doc;
        char* chemin;
    } fichier;
     
    void read(fichier*);
    void write(fichier*);
    void creat(fichier*);
     
    void buf(){
        int c = 0;
        while ((c = getchar()) != '\n');
    }
    void wait(){
        printf("\n Appuyez sur entrer pour retourner au menu...");
        buf();
    }
    void strcle(char* str){
        char* d = strchr(str, '\n');
        if (d) *d = '\0';
        else buf();
    }
     
    int main()
    {
        fichier monFichier;
        monFichier.doc = NULL;
        monFichier.chemin = NULL;
        char choixSec[2];
        int choix;
     
        printf("\n Bienvenue sur zReader - lisez, cr\x82""ez et \x82""crivez dans vos fichiers !\n");
     
        do{
            printf("\n 1. Lire"
                   "\n 2. Ecrire"
                   "\n 3. Cr\x82""er"
                   "\n 4. Quitter \n"
                   "\n Votre choix ? ");
     
            fgets(choixSec,2,stdin); buf();
            choix = atoi(choixSec);
     
            if(choix == 1) read(&monFichier);
            else if(choix == 2) write(&monFichier);
            else if(choix == 3) creat(&monFichier);
            else if(choix == 4) break;
            else printf("\n Mauvaise saisie !\n");
     
        }while(1);
     
        return EXIT_SUCCESS;
    }
     
    void read(fichier* monFichier)
    {
        monFichier->chemin = malloc(TAILLE * sizeof(char));
        char c[TAILLE];
     
        printf("\n Entrez le chemin du fichier : ");
        fgets(monFichier->chemin, TAILLE, stdin);
        strcle(monFichier->chemin);
        printf("\n\n");
     
        if(monFichier->doc = fopen(monFichier->chemin,"r"))
        {
            printf(" Contenu du fichier : \n\n");
            while (fgets(c,TAILLE,monFichier->doc) != NULL)
            printf(c);
            fclose(monFichier->doc);
        }
        else
        {
            printf(" Le fichier n'existe pas ! \n");
        }
        free(monFichier->chemin);
        wait();
    }
     
    void write(fichier* monFichier)
    {
        monFichier->chemin = malloc(TAILLE * sizeof(char));
        char inputInFile[TAILLE*3];
     
        printf("\n Entrez le chemin du fichier (si invalide, le fichier sera cr\x82""e) : ");
        fgets(monFichier->chemin, TAILLE, stdin);
        strcle(monFichier->chemin);
        printf("\n\n");
     
        monFichier->doc = fopen(monFichier->chemin,"w");
        printf(" Saisie dans le fichier (pour fermer, tapez \"f.close\") : \n\n");
        while(fgets(inputInFile,TAILLE*3,stdin))
        {
            if (strstr(inputInFile,"f.close"))
                break;
            fputs(inputInFile,monFichier->doc);
        }
        fclose(monFichier->doc);
        free(monFichier->chemin);
        printf("\n Contenu enregistr\x82"".");
        wait();
    }
     
    void creat(fichier* monFichier)
    {
        char path[TAILLE];
        char ext[30];
     
        printf("\n\n Nom du fichier (extension non-incluse) : ");
        fgets(path,TAILLE,stdin);
        strcle(path);
        printf("\n Extension du fichier : ");
        fgets(ext,30,stdin);
        strcle(ext);
     
        strcat(path,".");
        strcat(path,ext);
     
        monFichier->doc = fopen(path,"w");
        fclose(monFichier->doc);
        printf("\n Fichier cr\x82""e avec succ\x8a""s \n\n");
    }
    Dernière modification par LittleWhite ; 17/07/2013 à 00h44. Motif: Titre précis

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    buf() permet de lire l'entrée standard tant qu'il n'y a pas un \n....
    Mais comme il ne fait rien du "c", je suppose que ça ne sert pas à grand chose...

    Et le strcle, sert juste à resortir la 1ère ligne d'un texte, et transformer le '\n' en '\0'.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    buf() ressemble beaucoup à ça : http://c.developpez.com/faq/?page=cl...buffer_clavier

    Dans le code, strcle() est utilisée en conjonction avec fgets(), qui laisse normalement \n à la fin de la chaîne (avant le \0). Si ce caractère \n n’apparaît pas, alors la chaîne de destination est trop petite et il reste des caractères à nettoyer dans le buffer clavier, d'où buf().

Discussions similaires

  1. compréhension de code (passage à une autre page)
    Par kokokaine dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2007, 11h02
  2. Réponses: 3
    Dernier message: 12/01/2007, 09h42
  3. [VB-Access]recset! Pb de compréhension de code
    Par sk8bcn dans le forum VBA Access
    Réponses: 5
    Dernier message: 15/12/2006, 15h26
  4. Compréhension du code
    Par Ivanelis dans le forum Assembleur
    Réponses: 3
    Dernier message: 12/06/2006, 12h08
  5. Encart code + Fonction de colorisation
    Par Ovide dans le forum Langage
    Réponses: 1
    Dernier message: 30/10/2005, 01h12

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