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 :

[débutant] problème de lecture d'un entier dans une structure


Sujet :

C

  1. #1
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut [débutant] problème de lecture d'un entier dans une structure
    bonsoir ,
    voila j'ai tout essayé , mais j'ai pas trouvé la solution
    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
    #include <stdio.h>
     
    struct profil {
     
    	char nom[20];
    	char prenom[20];
    	int age;
    };
     
    void vidage(void)
    {
    	scanf("%*[^\n]");
    	getchar();
    }
     
    void main()
    {	
    	profil nouveau;
    	FILE *f;
    	char ch[100];
    	int choix;
    printf("-------------------------------------\n");
    printf("Fiche V 0.0 \n");
    printf("-------------------------------------\n");
    printf("BOUGUERRA MOHAMED SIRE G 4\n");
    	printf("\n");
    	printf("Choisir une de ces possibilité \n");
    	printf("1 : creer le fichier \n");
    	printf("2 : lire le fichier \n");
    	printf("3 : ajouter une fiche \n");
    	printf("4 : rechercher une fiche \n");
    	printf("\n");
    	scanf("%d" , &choix);
     
    switch(choix)
    {
    case 1: { f=fopen("data.txt","w+"); fclose(f); } break;
    case 2: { 
    	f=fopen("data.txt","r");
    	fgets(ch,100,f);
    	printf("%s", ch);
    	fclose(f);
    		} break;
    case 3: { 
    	f=fopen("data.txt","a+");
    		printf("nouvelle Fiche : \n");
    		printf("\n donner le nom : ");
    		vidage();
    		scanf("%s", nouveau.nom);
    		printf("\n donner le prenom : ");
    		vidage();
    		scanf("%s", nouveau.prenom );
    		printf("\n donner l age : ");
    		vidage();
    		scanf("%i", &nouveau.age ); //voici le problème , le compilateur me donne un certain 124050 !! 
    		vidage();
     
    		//testin
    printf("-------------------\n");
    printf("%s\n",nouveau.nom);
    printf("%s\n",nouveau.prenom);
    printf("%i\n", &nouveau.age);
     
    // testin ends
    		fputs(nouveau.nom,f);
    		fputs("     ",f);
    		fputs(nouveau.prenom,f);
    		fputs("     ",f);
    		putc(nouveau.age,f);
    		putc('\n',f);
     
    		fclose(f);
    		} break;
    default: printf("say bye\n");
     
    }
     
     
     
    }

  2. #2
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    pour tester le programme , il faut utiliser le compilateur de microsoft visual c++

  3. #3
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Salut,

    nouveau.age est un entier.

    scanf("%i",&nouveau.age);

    que signifie le i ? C'est d pour un nombre entier.

  4. #4
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    Salut,

    nouveau.age est un entier.

    scanf("%i",&nouveau.age);

    que signifie le i ? C'est d pour un nombre entier.
    salut, on peut lire avec %d ou avec %i,
    %d signifie d comme double
    %i signifie i comme integer

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%i", &nouveau.age ); //voici le problème , le compilateur me donne un certain 124050 !!
    comment ça "le compilateur"? ce n'est pas plutôt le code de test? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //testin
    //..
    printf("%i\n", &nouveau.age);
    //..
    // testin ends
    tu affiche l'adresse et non la valeur

  6. #6
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    oui j'ai commu une erreure
    j'ai fait affiché l adresse voila j'ai corrigé le code
    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
    #include <stdio.h>
     
    struct profil {
     
    	char nom[20];
    	char prenom[20];
    	int age;
    };
     
    void vidage(void)
    {
    	scanf("%*[^\n]");
    	getchar();
    }
     
    void main()
    {	
    	profil nouveau;
    	FILE *f;
    	char ch[100];
    	int choix;
    printf("-------------------------------------\n");
    printf("Fiche V 0.0 \n");
    printf("-------------------------------------\n");
    printf("BOUGUERRA MOHAMED SIRE G 4\n");
    	printf("\n");
    	printf("Choisir une de ces possibilité \n");
    	printf("1 : creer le fichier \n");
    	printf("2 : lire le fichier \n");
    	printf("3 : ajouter une fiche \n");
    	printf("4 : rechercher une fiche \n");
    	printf("5 : quitter \n");
    	printf("\n");
    	scanf("%d" , &choix);
     
    switch(choix)
    {
    case 1: { f=fopen("data.txt","w+"); fclose(f); } break;
    case 2: { 
    	f=fopen("data.txt","r");
    	fgets(ch,100,f);
    	printf("%s", ch);
    	fclose(f);
    		} break;
    case 3: { 
    	f=fopen("data.txt","a+");
    		printf("nouvelle Fiche : \n");
    		printf("\n donner le nom : ");
    		vidage();
    		scanf("%s", nouveau.nom);
    		printf("\n donner le prenom : ");
    		vidage();
    		scanf("%s", nouveau.prenom );
    		printf("\n donner l age : ");
    		vidage();
    		scanf("%i", &nouveau.age ); //voici le problème , le compilateur me donne un certain 124050 !! 
    		vidage();
     
    		//testin
    printf("-------------------\n");
    printf("%s\n",nouveau.nom);
    printf("%s\n",nouveau.prenom);
    printf("%i\n", nouveau.age);
     
    // testin ends
    		fputs(nouveau.nom,f);
    		fputs("     ",f);
    		fputs(nouveau.prenom,f);
    		fputs("     ",f);
    		fprintf(f,"%d",nouveau.age);
    		putc('\n',f);
     
    		fclose(f);
    		} break;
    case 4:  {
    	printf("donner le nom a recherche \n");
    	scanf("%s", ch);
    	f=fopen("data.txt","r"); }
    case 5: printf("\n"); break;
     
    default: main();
     
    }
     
     
     
    }
    merci

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par scofild20
    salut, on peut lire avec %d ou avec %i,
    %d signifie d comme double
    %i signifie i comme integer
    Ou as-tu lu cela? Le spécificateur de conversion %i est bel et bien une syntaxe valide et correspond à un entier éventuellement signé. La représentation de l'entier en question peut être sous forme octale ou hexadécimale. Le pointeur suivant doit être du type int*.

    Le spécificateur de conversion %d correspond à un entier décimal éventuellement signé, et le pointeur correspondant doit être du type int*.

    Pour saisir un nombre flottant de type double, il faut utiliser le spécificateur de conversion %lf.

    A part cela, scanf() est très mal utilisée dans ton code:
    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
    case 2: { 
    	f=fopen("data.txt","r");
    	fgets(ch,100,f);
    	printf("%s", ch);
    	fclose(f);
    		} break;
    case 3: { 
    	f=fopen("data.txt","a+");
    		printf("nouvelle Fiche : \n");
    		printf("\n donner le nom : ");
    		vidage();
    		scanf("%s", nouveau.nom);
    		printf("\n donner le prenom : ");
    		vidage();
    		scanf("%s", nouveau.prenom );
    Tu as utilisé une fois fgets(), alors pourquoi ne l'utilises-tu pas tout le temps pour la saisie de tes chaînes de caractères? scanf("%s", tampon) ne doit jamais être utilisée sous cette forme, à moins de savoir ce que l'on fait. Le code suivant montre comment utiliser fgets() pour saisir une chaîne de caractères de manière sécurisée: http://www.developpez.net/forums/sho...14&postcount=3. scanf() est une fonction extrêmement complexe, réservée aux spécialistes. La plupart des programmeurs expérimentés ne l'utilisent pas, ou alors apprennent à l'utiliser correctement. Le tutoriel de Xavier Renault est une lecture indispensable: http://xrenault.developpez.com/tutoriels/c/scanf/

    Par ailleurs, ce n'est pas logique de faire la vidange du tampon de stdin avant l'utilisation de scanf(). D'abord on fait la saisie, et ensuite on nettoie, non? Un dernière remarque: Avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\n donner le nom : ");
    Il n'est pas garantit que la chaîne "donner le nom: " s'affiche au moment où tu t'y attends. Pour forcer l'affichage, il faut vider le tampon du flux de sortie standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("\n donner le nom : ");
    fflush(stdout);
    De plus, l'emplacement de ton caractère Fin de Ligne est étrange. En effet, comme son nom l'indique, '\n' est fait pour être utilisé en fin de ligne.

    Finalement:
    n'est pas une forme correcte de main(), qui doit retourner un entier de type int. Toujours! Par convention, main retourne 0 ou EXIT_SUCCESS en cas d'exécution réussie, et toute autre valeur en cas d'erreur. Ainsi, main doit s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
        /* ... */
        return 0;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(int argc, char *argv[])
    {
        /*...*/
        return 0;
    }
    Thierry

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    et en plus, pour la lisibilité, mettre des accolades entre case et break n'est pas du meilleur effet... et parfaitement inutile....

Discussions similaires

  1. Problème de lecture d'un stream dans une boucle
    Par Kerberos69 dans le forum VBScript
    Réponses: 3
    Dernier message: 09/03/2009, 19h43
  2. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  3. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  4. Problème de lecture d'un entier au clavier
    Par Yakurena dans le forum C
    Réponses: 11
    Dernier message: 18/07/2005, 08h44
  5. [débutant] problème de lecture d'image
    Par shura dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/07/2004, 18h05

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