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 :

Dernière ligne afficher deux fois lors de la lecture d'un fichier


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut Dernière ligne afficher deux fois lors de la lecture d'un fichier
    Bonjour,

    J'ai un petit problème lors de l'affichage de mon fichier.

    1.Il m'affiche 2 fois le dernier client de mon fichier.
    2.Si mon fichier est vide, il ne m'affiche pas qu'il est vide.

    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
     
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define nc 10000
     
    //declaration enregistrement
    struct client
    {
           short numclient;
           char nom[25];
           char prenom[25];
    };
     
     
     
    //protoype
    void remplir(FILE *f);
    void afficher(FILE *f);
     
     
    //programme principal
    int main()
    {
        struct client c;
        char choix[3];
        short n=0;
        FILE *f;
     
        printf("Bienvenue dans mon programme sur les manipulations des fichier\n");
        printf("--------------------------------------------------------------");
     
        do
        {
        printf("\nMenu\n");
        printf("----\n");
        printf("1.Remplir\n");
        printf("2.Afficher\n");
        printf("0.Quitter\n\n");
        printf("Introduire votre choix:");
        fgets(choix,sizeof(choix),stdin);
     
            switch(choix[0])
            {
                         case '1':remplir(f);
                         break;
                         case '2':afficher(f);
                         break;
                         case '0':;
                         break;
                         default:printf("Choix incorrect !!!\n");
            }
     
        }while(choix[0]!='0');
     
        exit(0);
        return 0;
    }
     
     
    void remplir(FILE *f)
    {
    struct client c;
     
        if(f=fopen("tmp.dat","a+"))
        {                          
        printf("\nIntroduire le nom :");
        fgets(c.nom,sizeof(c.nom),stdin);
     
        printf("Introduire le prenom :");
        fgets(c.prenom,sizeof(c.prenom),stdin);
     
        c.numclient=nc;
     
        fwrite(&c,sizeof(struct client),1,f);                          
        }
        fclose(f);
    }
     
    void afficher(FILE *f)
    {
    struct client c;
     
         if(f=fopen("tmp.dat","r"))
         {
          if(feof(f))
          printf("Fichier vide !!!\n");
          else
          {
             while(!feof(f))
             {
             fread(&c,sizeof(struct client),1,f);
             printf("Client %hd:\n",c.numclient);
             printf("Nom :    %s",c.nom);
             printf("Prenom : %s\n",c.prenom);
             }
          }  
         fclose(f);
         }
         else
         {
         printf("Pas de fichier existant !!!\n");
         }
    }
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    1.Il m'affiche 2 fois le dernier client de mon fichier.
    Le problème doit certainement venir de ton :
    Je pense que tu lis deux fois ton dernier enregistrement.

    2.Si mon fichier est vide, il ne m'affiche pas qu'il est vide.
    Pour résoudre ce problème, tu peux envisager de bidonner ton fichier (écrire des NULL dans chaque champ), ceci te permettra, lorsque tu voudras afficher les enregistrements de ton fichier, de voir si la valeur renvoyée par fread() pour tes champs n'est pas NULL. (Note : il s'agit d'une solution parmis d'autres).

    Avoir : dans le main(), ne te sert à rien, sauf si tu veux passer l'adresse de la structure à ta fonction, ce que tu ne fais pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(feof(f)) 
    printf("Fichier vide !!!\n");
    Les accolades ne sont pas obligatoires dans ce cas-ci, mais fortement recommandées, elles permettent une meilleure lisibilité du code.

    Bonne codage,
    Did2604.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [fichier] affichage et remplissage
    Citation Envoyé par beloc
    J'ai un petit problème lors de l'affichage de mon fichier.

    1.Il m'affiche 2 fois le dernier client de mon fichier.
    2.Si mon fichier est vide, il ne m'affiche pas qu'il est vide.
    Mauvaise utilisation de feof().

    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Correction, simplification, nettoyage de la chaine saisie... Si tu ne comprends pas, pose des questions.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define nc 10000
     
    //declaration enregistrement
    struct client
    {
       unsigned numclient;
       char nom[25];
       char prenom[25];
    };
     
    int fget_s (char *s, size_t size, FILE * fp)
    {
       int err;
       if (fgets (s, (int) size, fp) != NULL)
       {
          char *p = strchr (s, '\n');
          if (p != NULL)
          {
             *p = 0;
             err = 0;
          }
          else
          {
             int c;
             while ((c = fgetc (fp)) != '\n' && c != EOF)
             {
             }
             err = 1;
          }
       }
       else
       {
          err = 1;
       }
       return err;
    }
     
    void remplir (void)
    {
       FILE *f = fopen ("tmp.dat", "a");
     
       if (f != NULL)
       {
          struct client c;
     
          printf ("\nIntroduire le nom :");
          fget_s (c.nom, sizeof c.nom, stdin);
     
          printf ("Introduire le prenom :");
          fget_s (c.prenom, sizeof c.prenom, stdin);
     
          c.numclient = nc;
     
          fwrite (&c, sizeof c, 1, f);
       }
       fclose (f);
    }
     
    void afficher (void)
    {
       FILE *f = fopen ("tmp.dat", "r");
     
       if (f != NULL)
       {
          struct client c;
     
          while (fread (&c, sizeof (struct client), 1, f) == 1)
          {
             printf ("Client %u:\n", c.numclient);
             printf ("Nom :    %s", c.nom);
             printf ("Prenom : %s\n", c.prenom);
          }
     
          fclose (f);
       }
       else
       {
          printf ("Pas de fichier existant !!!\n");
       }
    }
     
    /* programme principal */
    int main_ (void)
    {
       char choix[3];
       printf ("Bienvenue dans mon programme sur les manipulations des fichier\n");
       printf ("--------------------------------------------------------------");
     
       do
       {
     
          printf ("\nMenu\n");
          printf ("----\n");
          printf ("1.Remplir\n");
          printf ("2.Afficher\n");
          printf ("0.Quitter\n\n");
          printf ("Introduire votre choix:");
          fget_s (choix, sizeof choix, stdin);
     
          switch (choix[0])
          {
          case '1':
             remplir ();
             break;
          case '2':
             afficher ();
             break;
          case '0':;
             break;
          default:
             printf ("Choix incorrect !!!\n");
          }
     
       }
       while (choix[0] != '0');
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    merci beaucoup,

    Quelles sont les différences entre ta fonction fget_s & fgets ?

    Si j'ai bien compris fread renvoi le nbr de valeur lu.
    while (fread (&c, sizeof(struct client), 1, f) == 1)
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beloc
    Quelles sont les différences entre ta fonction fget_s & fgets ?
    La différence, c'est tout le code que j'ai rajouté dans fget_s(), qui est basée sur fgets(), comme tu as pu le constater. Le but de ma fonction est d'utiliser fgets() correctement. En l'occurence, ici, il s'agit de lire une ligne d'une longueur max donnée, et d'ignorer proprement les caractères en plus et de supprimer le '\n'. Evidemment, il faut connaitre le comportement de fgets(). Tout est dans la doc...

    Le principe est le suivant.

    - Lire la ligne avec fgets().
    - Tester la présence du '\n'
    - Si il est présent, l'éliminer, sinon, lire les caractères non lus.
    Si j'ai bien compris fread renvoi le nbr de valeur lu.
    while (fread (&c, sizeof(struct client), 1, f) == 1)
    Le nombre de blocs lus. comme indiqué dans le doc. C'est pas de la magie...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    merci beaucoup pour ton aide,

    je vais continuer les manipulations de fichier aujourd´hui.
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    Tout est dans la doc, tu sais ou je pourrais trouver une bonne doc en fr de tt les fonctions.

    Tchuss
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    Je suis toujours avec le même code.

    Je voulais savoir au niveau du choix dans le menu, les choix possible sont 0,1,2,3.

    Si je tape 123 ça fonctionne.
    Si je tape xyz y m'affichera 3 fois choix incorrect.

    Donc y faudrai que je fasse un test au niveau de la saisie.

    merci beaucoup,

    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
     
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define nc 10000
     
     
    //declaration enregistrement
    struct client
    {
           short numclient;
           char nom[25];
           char prenom[25];
    };
     
     
     
    //protoype
    void remplir();
    void afficher();
    int compter();
     
    //programme principal
    int main()
    {
        struct client c;
        char choix[3];
        short n=0;
     
        printf("Bienvenue dans mon programme sur les manipulations des fichier\n");
        printf("--------------------------------------------------------------");
     
        do
        {
        printf("\nMenu\n");
        printf("----\n");
        printf("1.Introduire un nouveau client.\n");
        printf("2.Afficher les clients.\n");
        printf("3.Nbr de client.\n");
        printf("0.Quitter\n\n");
        printf("Introduire votre choix:");
        fgets(choix,sizeof(choix),stdin);
     
            switch(choix[0])
            {
                         case '1':remplir();
                         break;
                         case '2':afficher();
                         break;
                         case '3':printf("Vous avez %hd client(s).",compter());
                         break;
                         case '0':
                         break;
                         default:printf("Choix incorrect !!!\n");
            }
     
        }while(choix[0]!='0');
     
        exit(0);
        return 0;
    }
     
    void remplir()
    {
    struct client c;
    FILE *f;
     
        if(f=fopen("tmp.dat","a+"))
        {                          
        printf("\nIntroduire le nom :");
        fgets(c.nom,sizeof(c.nom),stdin);
     
        printf("Introduire le prenom :");
        fgets(c.prenom,sizeof(c.prenom),stdin);
     
        c.numclient=nc+compter();
     
        fwrite(&c,sizeof(struct client),1,f);                          
     
        fclose(f);
        }
     
    }
     
    void afficher()
    {
    struct client c;
    FILE *f;
     
         if(f=fopen("tmp.dat","r"))
         {
          while (fread (&c, sizeof(struct client), 1, f) == 1) 
          {
             printf("Client %hd:\n",c.numclient);
             printf("Nom :    %s",c.nom);
             printf("Prenom : %s\n",c.prenom);
          }
         fclose(f);
         }
         else
         {
         printf("Pas de fichier existant !!!\n");
         }
    }
     
    int compter()
    {
    struct client c;
    int compteur=0; 
    FILE *f;
     
         if(f=fopen("tmp.dat","r"))
         {
          while (fread (&c, sizeof(struct client), 1, f) == 1) 
          ++compteur;
     
         fclose(f);
         }
         return(compteur);
    }
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beloc
    Tout est dans la doc, tu sais ou je pourrais trouver une bonne doc en fr de tt les fonctions.
    Moi, j'utilise l'aide en ligne de ma version française de Borland C++ 3.1... Il y a des pages 'man' en français sur internet... Il y a aussi le Kernighan & Ritchie edition 2 en français chez Dunod...

    Mais savoir lire l'anglais est indispensable dans ce métier... et c'est pas très difficile...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void remplir(FILE *f);
    void afficher(FILE *f);
    Je t'ai déjà expliqué que cet interface était inutile et confusante. Dans ton cas, 'FILE *f' n'a rien à faire dans main(), et doit être défini en local dans les fonctions.

    Attention, fgets() garde le '\n' final... J'ai expliqué comment le retirer...

    Il ne faut pas ouvrir 2 fois le même fichier. Essaye ça:

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
     
    #define nc 10000
     
    //declaration enregistrement
    struct client
    {
       int numclient;
       char nom[25];
       char prenom[25];
    };
     
    static int compter (void)
    {
       int compteur = 0;
       FILE *f = fopen ("tmp.dat", "r");
     
       if (f != NULL)
       {
          struct client c;
     
          while (fread (&c, sizeof c, 1, f) == 1)
          {
             compteur++;
          }
          fclose (f);
       }
       return compteur;
    }
     
    static void remplir (void)
    {
       struct client c;
     
       printf ("\nIntroduire le nom :");
       fgets (c.nom, sizeof (c.nom), stdin);
     
       printf ("Introduire le prenom :");
       fgets (c.prenom, sizeof (c.prenom), stdin);
     
       c.numclient = nc + compter ();
     
       {
          FILE *f = fopen ("tmp.dat", "a+");
     
          if (f != NULL)
          {
             fwrite (&c, sizeof c, 1, f);
             fclose (f);
          }
       }
    }
     
    static void afficher (void)
    {
       FILE *f = fopen ("tmp.dat", "r");
     
       if (f != NULL)
       {
          struct client c;
     
          while (fread (&c, sizeof (struct client), 1, f) == 1)
          {
             printf ("Client %d:\n", c.numclient);
             printf ("Nom :    %s", c.nom);
             printf ("Prenom : %s\n", c.prenom);
          }
          fclose (f);
       }
       else
       {
          printf ("Pas de fichier existant !!!\n");
       }
    }
     
    //programme principal
    int main ()
    {
       char choix[3];
     
       printf ("Bienvenue dans mon programme sur les manipulations des fichier\n");
       printf ("--------------------------------------------------------------");
     
       do
       {
          printf ("\nMenu\n");
          printf ("----\n");
          printf ("1.Introduire un nouveau client.\n");
          printf ("2.Afficher les clients.\n");
          printf ("3.Nbr de client.\n");
          printf ("0.Quitter\n\n");
          printf ("Introduire votre choix:");
          fgets (choix, sizeof (choix), stdin);
     
          switch (choix[0])
          {
          case '1':
             remplir ();
             break;
          case '2':
             afficher ();
             break;
          case '3':
             printf ("Vous avez %d client(s).", compter ());
             break;
          case '0':
             break;
          default:
             printf ("Choix incorrect !!!\n");
          }
       }
       while (choix[0] != '0');
     
       return 0;
    }
    Pose des questions si tu ne copmrends pas...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    Merci pour tes conseils,

    Je me débrouille en anglais, mais c'est vrai que le français reste ma langue maternelle.

    Je vais me diriger vers la fnac pour chercher le bouqin de Kernighan & Ritchie edition 2.

    ps: J'ai modifier mon code source plus haut. Le prof a demander qu'on travaille aves des prototypes et qu'on déclare les fonctions en dessous de main
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    D'abord un grand merci pour ton aide,

    1. Pourquoi déclarer les fonctions en static ?

    2. FILE *f = fopen ("tmp.dat", "r");

    if (f != NULL)

    c'est la même chose que ça

    FILE *f;

    if(f=fopen("tmp.dat","r"))


    Ps: j'ai été chercher le bouquin je vais commencer a le lire
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beloc
    1. Pourquoi déclarer les fonctions en static ?
    Principe de réduction de la portée des objets et des fonctions.

    http://emmanuel-delahaye.developpez....tes.htm#portee

    Et fait il faut tout lire! Toute la page et même tout le site!

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE *f = fopen ("tmp.dat", "r"); 
     
       if (f != NULL)
    c'est la même chose que ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FILE *f;
     
    if(f=fopen("tmp.dat","r"))
    Oui, mais l'un est plus lisible (et maintenable) que l'autre. Je te laisse deviner lequel ! En plus, ta version fait des warnings (possible confusion entre = et ==...)
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : Mai 2004
    Messages : 102
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par beloc
    1. Pourquoi déclarer les fonctions en static ?
    Principe de réduction de la portée des objets et des fonctions.

    http://emmanuel-delahaye.developpez....tes.htm#portee

    Et fait il faut tout lire! Toute la page et même tout le site!

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE *f = fopen ("tmp.dat", "r"); 
     
       if (f != NULL)
    c'est la même chose que ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FILE *f;
     
    if(f=fopen("tmp.dat","r"))
    Oui, mais l'un est plus lisible (et maintenable) que l'autre. Je te laisse deviner lequel ! En plus, ta version fait des warnings (possible confusion entre = et ==...)


    Quand on initialise une variable en static c'est une variable global qui si elle n'est pas initialisé s'inialise a 0.

    Alors je comprends pas trop ce que veut dire fonction static ?

    Sur ton site, je site :
    Il est possible cependant de réduire la portée de la fonction à l'unité de compilation dans laquelle elle a été définie, en ajoutant le qualificateur static.

    Je comprends pas trop ce que ça veut dire. C'est quoi une unité de compilation ?

    merci,
    Quand mille personnes prennent la route, il en faut une pour prendre la tête.

    LPIC2 - CCNA - MCP

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beloc
    Quand on initialise une variable en static c'est une variable global qui si elle n'est pas initialisé s'inialise a 0.
    Est-ce que tu arrives à comprendre cette phrase ? Moi, je n'y arrive pas.
    Le mot clé 'static' est expliqué dans les livres de C...

    Alors je comprends pas trop ce que veut dire fonction static ?

    Sur ton site, je site :
    Non. Tu 'cites' ! A force de massacrer la langue, on fini par être incompréhensible... Tout celà va mal finir...
    Il est possible cependant de réduire la portée de la fonction à l'unité de compilation dans laquelle elle a été définie, en ajoutant le qualificateur static.
    Je comprends pas trop ce que ça veut dire. C'est quoi une unité de compilation ?
    Un fichier source (.c)

    Par défaut, une fonction est de portée globale. Si elle se trouve dans une certaine unité de compilation, elle peut être appelée à partir d'une autre (pour ça, fournir un prototype). Cette possibilité de lien externe est invalidée par le mot clé 'static'. La portée de la fonction se trouve alors limitée à l'utilité de compilation dans laquelle elle est définie.

    L'analyse de flux du compilateur devient alors plus fine. Il peut dire 'telle fonction est définie mais jamais utilisée'. Il peut aussi prendre l'initiative de remplacer les appels de fonctions par le code de la fonction elle même (inline).
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur qui s'affiche deux fois au lieu de trois
    Par popolvictory dans le forum Forms
    Réponses: 2
    Dernier message: 23/10/2008, 16h00
  2. Réponses: 3
    Dernier message: 24/08/2008, 20h45
  3. Message de confirm qui s'affiche deux fois
    Par Lolie11 dans le forum Langage
    Réponses: 17
    Dernier message: 07/06/2007, 11h00
  4. Message de confirm qui s'affiche deux fois
    Par Lolie11 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/06/2007, 09h03
  5. Module Chat : atteindre la dernière ligne affiché dans un DIV
    Par hatembr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/06/2006, 13h17

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