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 :

Tentative de création de carnet d'adresses


Sujet :

C

  1. #21
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Je vais plutot faire comme vous dites et éviter la programmation modulaire pour l'instant J'ai tout mis dans le main en m'efforçant de faire un programme clair mais j'ai un problème lors de l'exécution du programme quand je saisis un nom

    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>
    #include <stdlib.h>
     
    int count = 0;
    char enreg [16] = { 0 };
    FILE * sortie = NULL;
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    int fecriture (char enreg [])
    {
        if (count == 1)
            {
                /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
                enreg [16] = '\0';
                fwrite (&enreg, sizeof (char), 16, sortie);
                /* On vide l'eventuel reste du tampon. */
                while (getchar () != '\n');
            }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
        int fecriture (char) ;
        char nomfich [21] = { 0 };
        int exe = 0 ;
        int menu = 0;
        printf ( " 0- Creation d'un Nouveau Fichier ?\n"
                 " 1- Modification d'un Fichier existant ?\n" );
        scanf ("%d", & menu);
        switch (menu)
        {
            case 0:
                {
                    printf ("Nom du fichier a creer ?");
                    scanf ("%s", nomfich);
                    sortie = fopen (nomfich, "w");
                    if (sortie != NULL)
                        {
                            do
                                {
                                    printf ("Nom ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (&enreg) ;
                                    printf ("Prenom ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                    printf ("Numero de telephone ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                }
                            while (count <= 0 || count > 1);
     
                            fclose (sortie);
                        }
                }
     
                break;
                default:
                break;
        }
     
        return EXIT_SUCCESS;
    }
    Ca me met rapport d'erreur Windows et je trouve pas l'erreur, quelqu'un peut m'aider svp ?
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  2. #22
    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 Jiraiya42
    Je vais plutot faire comme vous dites et éviter la programmation modulaire pour l'instant J'ai tout mis dans le main en m'efforçant de faire un programme clair mais j'ai un problème lors de l'exécution du programme quand je saisis un nom
    Tu aurais quand même pu éviter ces horribles globales...

    Il faut que tu apprennes à configurer ton compilateur pour qu'il te dise la vérité :
    Project : Forums
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:47: warning: char format, different type arg (arg 2)
    main.c:48: warning: passing arg 1 of `fecriture' makes integer from pointer without a cast
    main.c:50: warning: char format, different type arg (arg 2)
    main.c:51: warning: passing arg 1 of `fecriture' makes integer from pointer without a cast
    main.c:53: warning: char format, different type arg (arg 2)
    main.c:54: warning: passing arg 1 of `fecriture' makes integer from pointer without a cast
    main.c: In function `fecriture':
    main.c:21: warning: control reaches end of non-void function
    Linking console executable: C:\dev\forums\forums.exe
    Process terminated with status 0 (0 minutes, 6 seconds)
    0 errors, 7 warnings
    Par exemple, avec gcc : -Wall -Wextra -O2

    Ton code simplifié et corrigé :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    void fecriture (FILE * sortie, char enreg[], int count)
    {
       if (count == 1)
       {
          /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
          enreg[16] = '\0';
          fwrite (&enreg, sizeof (char), 16, sortie);
          /* On vide l'eventuel reste du tampon. */
          while (getchar () != '\n');
       }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
       char nomfich[21] = "";
       int menu = 0;
       printf (" 0- Creation d'un Nouveau Fichier ?\n"
               " 1- Modification d'un Fichier existant ?\n");
       scanf ("%d", &menu);
       switch (menu)
       {
       case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
             FILE *sortie = fopen (nomfich, "w");
             if (sortie != NULL)
             {
                int count = 0;
                do
                {
                   char enreg[16] = "";
                   printf ("Nom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Prenom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Numero de telephone ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
     
          break;
       default:
          break;
       }
     
       return EXIT_SUCCESS;
    }
    Pas de Wi-Fi à la maison : CPL

  3. #23
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu aurais quand même pu éviter ces horribles globales...

    Il faut que tu apprennes à configurer ton compilateur pour qu'il te dise la vérité :

    Par exemple, avec gcc : -Wall -Wextra -O2

    Ton code simplifié et corrigé :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    void fecriture (FILE * sortie, char enreg[], int count)
    {
       if (count == 1)
       {
          /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
          enreg[16] = '\0';
          fwrite (&enreg, sizeof (char), 16, sortie);
          /* On vide l'eventuel reste du tampon. */
          while (getchar () != '\n');
       }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
       char nomfich[21] = "";
       int menu = 0;
       printf (" 0- Creation d'un Nouveau Fichier ?\n"
               " 1- Modification d'un Fichier existant ?\n");
       scanf ("%d", &menu);
       switch (menu)
       {
       case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
             FILE *sortie = fopen (nomfich, "w");
             if (sortie != NULL)
             {
                int count = 0;
                do
                {
                   char enreg[16] = "";
                   printf ("Nom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Prenom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Numero de telephone ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
     
          break;
       default:
          break;
       }
     
       return EXIT_SUCCESS;
    }
    Oui pour les variables globales c'est que j'ai betement pas pensé à les passer en paramètre...je sais pas pourquoi d'ailleurs et je vais essayer de configurer mon compilateur mais j'avou ne pas savoir faire, j'utilise Code:Blocks avec comme compilateur GNU GCC Compiler je vais essayer, ce doit etre faisable sans doute
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  4. #24
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ton code simplifié et corrigé :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    void fecriture (FILE * sortie, char enreg[], int count)
    {
       if (count == 1)
       {
          /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
          enreg[16] = '\0';
          fwrite (&enreg, sizeof (char), 16, sortie);
          /* On vide l'eventuel reste du tampon. */
          while (getchar () != '\n');
       }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
       char nomfich[21] = "";
       int menu = 0;
       printf (" 0- Creation d'un Nouveau Fichier ?\n"
               " 1- Modification d'un Fichier existant ?\n");
       scanf ("%d", &menu);
       switch (menu)
       {
       case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
             FILE *sortie = fopen (nomfich, "w");
             if (sortie != NULL)
             {
                int count = 0;
                do
                {
                   char enreg[16] = "";
                   printf ("Nom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Prenom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                   printf ("Numero de telephone ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, count);
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
     
          break;
       default:
          break;
       }
     
       return EXIT_SUCCESS;
    }
    Quand j'essai ton code ça m'affiche des caractères illisibles dans le fichier testé
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  5. #25
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Quelqu'un peut m'aider svp ? J'arrive pas à résoudre ce problème de mauvais affichage des caractères
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  6. #26
    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 Jiraiya42
    Quelqu'un peut m'aider svp ? J'arrive pas à résoudre ce problème de mauvais affichage des caractères
    Je viens de découvrir un bug dans ton code. Dans la fonction fecriture(), tu ecris :
    Or, si on lit le main(), on voit que enreg est un tableau de 16 char, dont les indices valides vont de 0 à 15. Cette ligne constitue donc un comportement indéfini. Tout peut arriver.

    Ce problème illustre le fait que l'interface de la fonction, que j'ai modifiée pour ne pas avoir de globales, est incomplet. Il manque en effet la taille du bloc, utilisée au moins 2 fois dans celle-ci.

    Je propose donc d'écrire du code plus souple (et par la même occasion plus correct) de la façon suivante :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    void fecriture (FILE * sortie, char enreg[], size_t size, int count)
    {
       if (count == 1)
       {
          /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
          enreg[size - 1] = '\0';
          fwrite (&enreg, 1, size, sortie);
          /* On vide l'eventuel reste du tampon. */
          while (getchar () != '\n');
       }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
       char nomfich[21] = "";
       int menu = 0;
       printf (" 0- Creation d'un Nouveau Fichier ?\n"
               " 1- Modification d'un Fichier existant ?\n");
       scanf ("%d", &menu);
       switch (menu)
       {
       case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
             FILE *sortie = fopen (nomfich, "w");
             if (sortie != NULL)
             {
                int count = 0;
                do
                {
                   char enreg[16] = "";
                   printf ("Nom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                   printf ("Prenom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                   printf ("Numero de telephone ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
     
          break;
       default:
          break;
       }
     
       return EXIT_SUCCESS;
    }
    En fait, en regardant de plus près, je ne vois pas très bien pourquoi tu utilises fwrite pour enregistrer les données. A moins de vouloir un format fixe, ce qui n'est ni très pratique ni très optimisé, il est préférabe d'utiliser un format texte simple, comme CSV (Les champs sont séparés par des virgules ou des point-virgules). Chaque enregistrement étant terminé par une fin de ligne. On obtient un fichier texte facilement lisible, voire modifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Alfred;Wallace;01234567
    Jules;Caesar;99999999
    etc.
    Il suffit donc d'utiliser fprintf() directement, avec, par exemple, "%s;%s;%s\n"

    D'autre part, la fonction est curieusement conçue. en principe, une fonction fait un travail. Ici, elle en fait 2 complètement disjoints : ecrire dans le fichier, puger stdin. Ca n'a aucun sens... Il n'y a aucun lien entre les deux et ça compromet la réutilisation de la fonction dans un autre contexte...

    Il est interessant de faire une fonction qui résout le problème de la saisie d'une façon calire et fiable.

    L'enregistrement dans le fichier est complètement autre chose. Le seul lien etre les deux est la donnée saisie, ce qui se modèlise en pseudo-code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    data := saisir()
    enregister(data)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    saisir(data)
    enregister(data)
    On voit bien les deux fonctions et le lien par les données.

    Je te propose de réécrire ton code sur ces bases. Je rappelle qu'une bonne conception est la base de la réussite d'un projet.
    Pas de Wi-Fi à la maison : CPL

  7. #27
    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 Jiraiya42
    je vais essayer de configurer mon compilateur mais j'avou ne pas savoir faire, j'utilise Code:Blocks avec comme compilateur GNU GCC Compiler je vais essayer, ce doit etre faisable sans doute
    Moi non plus (la premère fois), mais c'est pas très dur à trouver...

    setting / compiler /
    Onglet 'compiler'
    Onglet 'other options'
    Entrer les options que j'ai indiqué...
    Pas de Wi-Fi à la maison : CPL

  8. #28
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je viens de découvrir un bug dans ton code. Dans la fonction fecriture(), tu ecris :
    Or, si on lit le main(), on voit que enreg est un tableau de 16 char, dont les indices valides vont de 0 à 15. Cette ligne constitue donc un comportement indéfini. Tout peut arriver.

    Ce problème illustre le fait que l'interface de la fonction, que j'ai modifiée pour ne pas avoir de globales, est incomplet. Il manque en effet la taille du bloc, utilisée au moins 2 fois dans celle-ci.

    Je propose donc d'écrire du code plus souple (et par la même occasion plus correct) de la façon suivante :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /*****************************************************************************/
    /*************************** FONCTION ECRITURE *******************************/
    /*****************************************************************************/
    void fecriture (FILE * sortie, char enreg[], size_t size, int count)
    {
       if (count == 1)
       {
          /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
          enreg[size - 1] = '\0';
          fwrite (&enreg, 1, size, sortie);
          /* On vide l'eventuel reste du tampon. */
          while (getchar () != '\n');
       }
    }
     
    /******************************************************************************/
    /*************************** PROGRAMME PRINCIPAL ******************************/
    /******************************************************************************/
    int main (void)
    {
       char nomfich[21] = "";
       int menu = 0;
       printf (" 0- Creation d'un Nouveau Fichier ?\n"
               " 1- Modification d'un Fichier existant ?\n");
       scanf ("%d", &menu);
       switch (menu)
       {
       case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
             FILE *sortie = fopen (nomfich, "w");
             if (sortie != NULL)
             {
                int count = 0;
                do
                {
                   char enreg[16] = "";
                   printf ("Nom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                   printf ("Prenom ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                   printf ("Numero de telephone ?");
                   count = scanf ("%15s", enreg);
                   fecriture (sortie, enreg, sizeof enreg, count);
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
     
          break;
       default:
          break;
       }
     
       return EXIT_SUCCESS;
    }
    En fait, en regardant de plus près, je ne vois pas très bien pourquoi tu utilises fwrite pour enregistrer les données. A moins de vouloir un format fixe, ce qui n'est ni très pratique ni très optimisé, il est préférabe d'utiliser un format texte simple, comme CSV (Les champs sont séparés par des virgules ou des point-virgules). Chaque enregistrement étant terminé par une fin de ligne. On obtient un fichier texte facilement lisible, voire modifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Alfred;Wallace;01234567
    Jules;Caesar;99999999
    etc.
    Il suffit donc d'utiliser fprintf() directement, avec, par exemple, "%s;%s;%s\n"

    D'autre part, la fonction est curieusement conçue. en principe, une fonction fait un travail. Ici, elle en fait 2 complètement disjoints : ecrire dans le fichier, puger stdin. Ca n'a aucun sens... Il n'y a aucun lien entre les deux et ça compromet la réutilisation de la fonction dans un autre contexte...

    Il est interessant de faire une fonction qui résout le problème de la saisie d'une façon calire et fiable.

    L'enregistrement dans le fichier est complètement autre chose. Le seul lien etre les deux est la donnée saisie, ce qui se modèlise en pseudo-code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    data := saisir()
    enregister(data)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    saisir(data)
    enregister(data)
    On voit bien les deux fonctions et le lien par les données.

    Je te propose de réécrire ton code sur ces bases. Je rappelle qu'une bonne conception est la base de la réussite d'un projet.
    Merci beaucoup de ta réponse très complète, ben j'ai utilisé fwrite car j'ai acheté un livre de programmation C et il est dit que pour écrire dans un fichier on utilise fwrite donc j'applique juste Je vois qu'il y a une autre solution comme tu le dis mais je trouve pas ça très beau car le but serait d'avoir au final un fichier texte très lisible qu'on peut imprimer tu vois ?

    PS: Les options que tu dis m'avoir donner pour le compileur je les trouve pas, tu me les avais indiqué quand stp ?
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  9. #29
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Jiraiya42
    Merci beaucoup de ta réponse très complète, ben j'ai utilisé fwrite car j'ai acheté un livre de programmation C et il est dit que pour écrire dans un fichier on utilise fwrite donc j'applique juste Je vois qu'il y a une autre solution comme tu le dis mais je trouve pas ça très beau car le but serait d'avoir au final un fichier texte très lisible qu'on peut imprimer tu vois ?
    L'idée d'utiliser fprintf au lieu de fwrite est bonne. L'exemple de mise en forme des enregistrement qu'il t'as donné n'est qu'un exemple, certes si tu veux aussi pouvoir imprimer ce n'est pas la meilleure présentation !

    Cette forme d'enregistrement est très bien pour faire un chargement, une ligne par personne et tu parses juste une ligne pour charger les données d'une personne, y'a pas mieux mais rien n'empêche de mettre en forme différement si tu le veux, c'est l'avantage de l'utilisation de fprintf, tu met en forme comme tu le souhaite !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #30
    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 Jiraiya42
    Merci beaucoup de ta réponse très complète, ben j'ai utilisé fwrite car j'ai acheté un livre de programmation C et il est dit que pour écrire dans un fichier on utilise fwrite donc j'applique juste Je vois qu'il y a une autre solution comme tu le dis mais je trouve pas ça très beau car le but serait d'avoir au final un fichier texte très lisible qu'on peut imprimer tu vois ?
    Ca, c'est un autre traitement. Il est logique d'avoir d'une part un fichier de données de référence compact, mais lisible, voire éditable et facilement utilisable par programme, et d'autre part, à la demande, de construire un ficher d'impression avec mise en page etc. Il ne faut pas confondre les deux.
    PS: Les options que tu dis m'avoir donner pour le compileur je les trouve pas, tu me les avais indiqué quand stp ?
    Message #22 de ce thread...
    Pas de Wi-Fi à la maison : CPL

  11. #31
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ca, c'est un autre traitement. Il est logique d'avoir d'une part un fichier de données de référence compact, mais lisible, voire éditable et facilement utilisable par programme, et d'autre part, à la demande, de construire un ficher d'impression avec mise en page etc. Il ne faut pas confondre les deux.
    Message #22 de ce thread...
    Ton code se compile mais le programme ne se lance pas
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  12. #32
    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 Jiraiya42
    Ton code se compile mais le programme ne se lance pas
    C'est à dire ? Messages d'erreurs ? Comportement visible ?

    De toutes façon, il n'y a pas vraiment de 'mon' code. C'est plutôt à toi d'écrire le tien et de le poster si tu as des problèmes... Je ne fais que montrer quelques exemples...

    Commence par travailler sur la conception avant de coder.
    Pas de Wi-Fi à la maison : CPL

  13. #33
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Je suis débutant et vient de créer un carnet d'adresses aussi.
    Si tu veux le code source, demande le moi.

  14. #34
    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 0v3rb1t
    Je suis débutant et vient de créer un carnet d'adresses aussi.
    Si tu veux le code source, demande le moi.
    Ben non. En phase d'apprentissage, il faut concevoir le programme et écrire le code soi-même et se casser les dents dessus. C'est fait pour. On apprend par ses erreurs.
    Pas de Wi-Fi à la maison : CPL

  15. #35
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par 0v3rb1t
    Je suis débutant et vient de créer un carnet d'adresses aussi.
    Si tu veux le code source, demande le moi.
    Oui je le veux bien avec plaisir, ça me permettra de voir où je me rate L'apprentissage passe par la confrontation avec des problèmes je suis d'accord, (d'ailleurs je pense m'être pas mal "casser les dents dessus") mais il passe aussi par l'entraide entre les developpeurs
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  16. #36
    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 Jiraiya42
    Oui je le veux bien avec plaisir, ça me permettra de voir où je me rate L'apprentissage passe par la confrontation avec des problèmes je suis d'accord, (d'ailleurs je pense m'être pas mal "casser les dents dessus") mais il passe aussi par l'entraide entre les developpeurs
    Si pour toi, l'entraide, c'est de piquer le code des autres, tu t'es tompé de forum...
    Pas de Wi-Fi à la maison : CPL

  17. #37
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si pour toi, l'entraide, c'est de piquer le code des autres, tu t'es tompé de forum...
    Ben non, je me suis pas trompé de forum puisque je cherche à apprendre. Le code en lui meme m'importe peu puisque le carnet d'adresse est pour moi. C'est histoire d'avoir un exemple pour comprendre le fonctionnement tout simplement. Une exemple concret vaut mieux que toute la théorie du monde

    PS: Je sais pas pourquoi mais je suis sur que tu es prof
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  18. #38
    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 Jiraiya42
    PS: Je sais pas pourquoi mais je suis sur que tu es prof
    Pas encore, j'y travaille !

    Ce que je te propose, c'est un peu de théorie et beaucoup de pratique. Lire le code des autres n'apporte pas grand chose si on ne maitrise pas le langage...
    Pas de Wi-Fi à la maison : CPL

  19. #39
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas encore, j'y travaille !
    Quelque chose me dit que tu es sur la bonne voie

    Citation Envoyé par Emmanuel Delahaye
    Ce que je te propose, c'est un peu de théorie et beaucoup de pratique. Lire le code des autres n'apporte pas grand chose si on ne maitrise pas le langage...
    Un peu de théorie vi et beaucoup de pratique je suis d'accord et cette pratique passe aussi pas l'étude de programme déjà conçu et je le sais bien car j'ai appris d'autres langages de cette manière Ce n'est pas parce que tu as une méthode pour apprendre qu'elle est obligatoirement la meilleure... désolé mais ça c'est une caractéristique de prof
    "Vous qui entrez ici, abandonnez toute espérance." Dante

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    dans le mien il y a des fgets() et pas mal de boucles, et une struture, avec de l'allocation de mémoire, il est donc assez compliqué.
    je te up le projet sur filefront si tu veux.

    mais mieux vaut réfléchir que d'abandonner.
    en effet j'ai passé environ 5 heures dessus avant de le terminer.
    de plus il y a certaines choses déplaisantes et non portables.



    mais -ED-, au sujet du livre de Braquelaire, il est écrit que : "Cet ouvrage qui s'adresse aux étudiants de master d'informatique, aux élèves-ingénieurs et aux développeurs".


    Ai-je le niveau pour lire ce livre...

Discussions similaires

  1. [OL-2010] Création carnets d'adresses dans outlook 2010
    Par BORTA77 dans le forum Outlook
    Réponses: 8
    Dernier message: 13/01/2015, 16h40
  2. [LDAP] Création d'un carnet d'adresse privé pour chaque utilisateur
    Par montaropdf dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 23/03/2011, 13h29
  3. Création d'un carnet d'adresse
    Par rori dans le forum Windows
    Réponses: 2
    Dernier message: 07/11/2006, 09h15
  4. Récupérer le carnet d'adresses de Outlook
    Par pc75 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/02/2005, 12h30

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