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 :

Utilisation de valeurs enumérées pour une comparaison


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut Utilisation de valeurs enumérées pour une comparaison
    salut a tous
    premierement je voudrais de mander si lorsqu'on utilise le code ci-dessous cest correcte car dessus je ne vois pas d'allocation despace pour la variable test!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         typedef char *String;
     
         main()
         {
             String Text = "Thunderbird";
     
             printf("%s\n", Text);
         }
    ensuite j'aime rai que vous m'aidiez a corriger le code suivant afin que je puisse savoir si le string entrer par un utilisateur correspond a l'une des valeurs correspondantes de mon typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef enum {add=0,remov,move,end} todo1;
    .........
    et puis 
    		printf("choose an Action : ");
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    pourquoi ne puis je pas declarer une variable todo de type todo1 et ecrire simplement "if (todo==add).." par exempe ???
    merci d'avance!!!!
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut
    pour ceux que ca interessent voici l'etat actuel de mon programme
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    static void purge( void)
    {
    	char c;
    	while ( ((c=getchar()) != '\n') && (c!=EOF) )
    	{};
    }
    static void clean(char *chaine)
    {
    	char *p=strchr(chaine,'\n');
    	if (p)
    		*p='\0';
    	else purge();
    }
     
    typedef enum {add=0,move,remove,delete,deleteall,save,end} todo1;
     
    char days[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    char months[12][12]={"january","february","march","april","mai","june","july","august","september","october","november","december" };
     
    struct date 
    {
    	char d[10],m[11];
    	unsigned y;
    };
    struct client
    {
    	int num;
    	char name[50],street[60];
    	struct date limit;
    	struct client *prev,*next;
     
    };
    int main(void)
    {
    	char todo[15];
    	int t9;
    	FILE *liste;
     
    	printf(" CREATING A NEW LIST\n");
    	printf("Available Action : choose between  add/move/remove/delete/deleteall/save/end\n");
     
    	do
    	{
    		printf("choose an Action : ");
    		//scanf("%s",&todo);
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    		switch 
    		if ( !strcmp(todo,"add") )
     
    /*
     
              jaimerais changer cet endroit en un switch case cest pour ca que je      
              pose la question
     
     */
    	} while( strcmp(todo,"end")!=0);
    }
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  3. #3
    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 chrysmac2003
    premierement je voudrais de mander si lorsqu'on utilise le code ci-dessous cest correcte car dessus je ne vois pas d'allocation despace pour la variable test!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         typedef char *String;
     
         main()
         {
             String Text = "Thunderbird";
     
             printf("%s\n", Text);
         }
    En fait le code en lui même ne contient pas de fautes... j'explique. Ceci:
    Créé un nouveau type utilisateur donc, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String Text = "Thunderbird";
    est l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * Text = "Thunderbird";
    tout simplement


    Citation Envoyé par chrysmac2003
    ensuite j'aime rai que vous m'aidiez a corriger le code suivant afin que je puisse savoir si le string entrer par un utilisateur correspond a l'une des valeurs correspondantes de mon typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef enum {add=0,remov,move,end} todo1;
    .........
    et puis 
    		printf("choose an Action : ");
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    pourquoi ne puis je pas declarer une variable todo de type todo1 et ecrire simplement "if (todo==add).." par exempe ???
    merci d'avance!!!!
    Bin pourquoi tu pourrais pas déclarer une variable de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef enum {add=0,remov,move,end} todo1;
    todo1 todo;
    Pas de problèmes Par contre, si tu récupère une valeur avec fgets, il te faut la convertir en entier avec strtol pour pouvoir faire ta comparaison ! Le mieux, si c'est pour un choix utilisateur, une fois ta valeur convertie, c'est d'utiliser un switch comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch (todo)
    {
       case add:
       {
       }
       break;
     
       case remove:
       {
       }
       break;
    }
    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 !

  4. #4
    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
    Voici un petit exemple vite fait:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef enum
    {
       ADD = 1,  /* 1 c'est plus simple pour une saisie utilisateur car,
                    0 veut souvent dire 'quitter'. */
       REMOVE,
       MOVE,
       END
    }
    todo_t; /* todo_t pour en fait toto_type */
     
     
    int main (void)
    {
       char todo [15] = { 0 };
       todo_t val;
     
     
       printf ("choose an Action : ");
       fgets (todo, sizeof todo, stdin);
     
       val = (todo_t) strtol (todo, NULL, 10);
     
       switch (val)
       {
          case ADD:
          {
             printf ("Action : ADD\n");
          }
          break;
     
          case REMOVE:
          {
             printf ("Action : REMOVE\n");
          }
          break;
     
          case MOVE:
          {
             printf ("Action : MOVE\n");
          }
          break;
     
          case END:
          {
             printf ("Action : END\n");
          }
          break;
     
          default:
          {
             printf ("Erreur, saisie incorrecte !\n");
          }
          break;
       }
     
     
       return 0;
    }
    Juste une petite précision, les énumération étant en fait des énumérations de constantes, il est en générale dans les règle de l'art, que les identifiants soit en majuscule car en fait, ce ne sont que des constantes, rien de plus

    Pose des questions sur ce que tu ne comprend pas
    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 !

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut ouvrir un fichier
    merci pour l'aide franck,
    mais, lorsque je fais la convertion i=strtol (todo, NULL, 10);
    elle me donne toujours 0!??!
    quand jexecute ton exemple par exemple,ca donne toujours
    Erreur, saisie incorrecte ! quand bien meme j'entre ADD en majuscule
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  6. #6
    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 chrysmac2003
    [...]quand bien meme j'entre ADD en majuscule
    J'espère pour toi que tu n'entres pas comme saisie utilisateur:


    Il faut ici entrer une valeur numérique ... dans mon exemple ! Montre voir ton code qui ne fonctionne pas !
    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 !

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut
    en effet quand jentre le chiffre 1 comme utilisateur, ca passe bien dans le case ADD, mais un utilisateur nest pas sensé entré des chiffres!!!!!
    (et quand bien meme ca passe ma fonction fileexist bug le programme, apparemment il y'a une erreur dans mon fprintf,bon je ne lai jamais utiliser avant donc je ne sais pas trop
    en mettant le fprintf dans fileexist sous commentaire, le programme s'execute comme attendu(du moins ceque j'ai deja fais)
    voici 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
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
     
    typedef char *string;
    typedef enum {ADD=1,MOVE,REMOV,DELET,DELETALL,SAVE,END} todo_t;
    //typedef enum {monday,tuesday,wednesday,thursday,friday,saturday,sunday} day;
    char days[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    char months[12][12]={"january","february","march","april","mai","june","july","august","september","october","november","december" };
     
    const int daymax=31;
    static void purge( void)
    {
    	char c;
    	while ( ((c=getchar()) != '\n') && (c!=EOF) )
    	{};
    }
    static void clean(char *chaine)
    {
    	char *p=strchr(chaine,'\n');
    	if (p)
    		*p='\0';
    	else purge();
    }
     
     
    struct date 
    {
    	int d;
    	char m[11];
    	unsigned int y;
    };
    struct client
    {
    	int num;
    	char name[50],street[60];
    	struct date limit;
    	struct client *prev,*next;
     
    };
    int fileexist(FILE *liste1)
    {
    	if ( ( liste1=fopen("C:\Programing\file02.doc","a+") )== NULL )
    		{
     
    			liste1=fopen("C:\Programing\file02.doc","a+");
     
    			//fprintf(liste1,"Client List :\n  Name\t\t Address \t\t\t\t Delay\t\t\t\n");
    			printf("return 1\n");
    			return 1;
    		}
    	else return 0;
     
    };
     
    void angabe(struct client *var,FILE *liste1)
    {
    	char c;
    	char str[3],str1[5];
     
    	printf("type a name please :");
    	fgets(var->name,50,stdin);
    	clean(var->name);
    	fprintf(liste1,"\n%d- %s \t",var->num,var->name);
     
    	printf("type the address of the client : ");
    	fgets(var->street,sizeof(var->street),stdin);
    	clean(var->street);
    	fprintf(liste1,"%s \t",var->street);
    	printf("give the delay for his/her payment :\nday :");
    	//scanf("%lu",&(var->limit.d));
    	fgets(str,2,stdin);
    	clean(str);
     
    	var->limit.d=string2int1(str,strlen(str));
    	fprintf(liste1,"%d \t",var->limit.d);
    	printf("; month : ");
    	fgets(var->limit.m,sizeof(var->limit.m),stdin);
    	clean(var->limit.m);
    	//scanf("%s",var->limit.m);
    	fprintf(liste1,"%s \t",var->limit.m);
    	printf("; year : ");
    	fgets(str,4,stdin);
    	//scanf("%lu",&(var->limit.y));
        clean(str);
     
    	var->limit.y=string2int1(str,strlen(str));
    	fprintf(liste1,"%d \t",var->limit.y);
    	printf(";\n");
    };
     
    int main(void)
    {
    	char todo[15],*char1=malloc(sizeof(char));
    	todo_t val1;
    	int t9;
    	FILE *liste;
    	struct client *first,*last,*var1,*temp,*var;
     
     
    	temp=malloc(sizeof(struct client));
    	printf(" CREATING A NEW LIST\n");
    	printf("Available Action : choose between  add/remov/delet/deleteall/save/end\n");
     
    	do
    	{
    		int z11;
     
    		printf("choose an Action : ");
    		//scanf("%s",&todo);
    		fgets(todo,sizeof(todo),stdin);
    		clean(todo);
    		val1=(todo_t) strtol(todo,NULL,10);
    		printf("todo=%s->%ld   val1=%d\n",todo,strtol(todo,NULL,10),val1);
    		switch (val1 )
    		{
    			                                               //typedef enum {ADD=1,MOVE,REMOV,DELET,DELETALL,SAVE,END} todo_t;
    		case ADD :                                                                    //if ( !strcmp(todo,"add") )
    			{
    				printf("ADD");
    			    z11=fileexist(liste);
    			    /*angabe(temp,liste);
     
    			    if ( first)
    			    {}
    			    else
    			    {
    				temp->num=0;
    				first=temp;
    			    last=temp;
     
    			    }*/
    			    free(temp);
    			    //fclose(liste);
    			    //printf("z11=%d",z11);
    			}; break;
    		case REMOV : break;
    		default : 
    			if ( strcmp(todo,"END")!=0 )
    				printf("please try again\n");
    		}
     
    	} while( strcmp(todo,"END")!=0);
    }
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par chrysmac2003
    en effet quand jentre le chiffre 1 comme utilisateur, ca passe bien dans le case ADD, mais un utilisateur nest pas sensé entré des chiffres!!!!!
    (...)
    Pourquoi

    Honnetement, il est de pratique courrante de demander à l'utilsiateur d'introduire un chiffre ou un nombre quand on lui demande de faire un choix au travèrs d'un menu...

    Et cela parrait d'autant plus sensé que le nombre de choix reste, malgré tout, limité
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    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 koala01
    Honnetement, il est de pratique courrante de demander à l'utilsiateur d'introduire un chiffre ou un nombre quand on lui demande de faire un choix au travèrs d'un menu...
    Surtout que cela évite des erreurs de saisies, entrer un chiffre limite plus les erreurs qu'entrer un mot, surtout que le C tiens compte de la casse ! Si maintenant c'est quelque chose qui t'es imposé (par un prof, un cahier des charges ou je ne sais trop quoi d'autre), il faut revoir certaines parties:
    • Ne pas utiliser des énumérations de constantes
    • Utiliser des constantes caractères OU (même mieux), des constantes symboliques, une pour chaque commande !
    • Ne plus convertir avec strtol car ca ne sert plus à rien
    • N'utiliser que fgets et éventuellement virer le '\n' lors de la récupération d'une saisie avec cette fonction et le remplacer par un '\0' sinon la comparaison avec strcmp risque fort d'échouer !
    • Comparer le contenu du buffer rempli par fgets avec les constantes symboliques


    Voilà, mais j'opterais à ta place (si tu as le choix) pour une saisie d'un entier au lieu d'une chaîne !
    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. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Franck.H
    Surtout que cela évite des erreurs de saisies, entrer un chiffre limite plus les erreurs qu'entrer un mot, surtout que le C tiens compte de la casse !
    (...)
    Pour les noms de variables, c'est effectivement un problème, mais, pour les valeurs, ce peut etre facilement convertible en "tout minuscule" ou "tout majuscule"...

    Par contre, il est vrai que la comparaison de deux chaines est malgré tout bien plus complexe (AKA susceptible de prendre plus de temps, du fait de l'utilisation forcée de strcmp) que la comparaison de deux entiers... et c'est surtout là que réside l'avantage

    Pour le reste, de ton post, je ne peux que plussoter
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut
    ok dans un premier temps j'utiliserais donc des nombres, je rectifierais ca au choix plus tard. Pour l'instant comme vous avez pu le remarqué je commence juste avec l'entrée/sortie sur les fichers. Mon but (exercice personnel) est de creer une liste chainée(de livraisons),qui pourraient etre sauvegardée dans un fichier texte , de telle fassont que a une nouvelle execution du fichier les modifications faites lors de la derniere execution soit toujours valides.
    premier probleme, est ce que comme je le pense, le code suivant m'aiderai a placer le curseur dans le fichier file02 au point juste apres le string "-1", si bien sur il existe deja!!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     liste=fopen("C:\Programing\file02.doc","r");
     if ( Liste)
    {
          while( (fgets(char2,sizeof(char2),liste)==NULL) || (!strcmp(char2,"-1")) )
    	   {};
    ....
    				}
    ce code me servira a commencer a cette endroit a reuperer le premie element sauvegardée dans ma liste dans le fichier02(qui sera créé lors de la premiere utilisation du programme)
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Heu, avant de répondre, je préfèrerais te poser la question subsidiaire:

    as tu suffisemment "percuté" sur les liste chainées que pour te permettre de vouloir les utiliser en conjonction avec les fichiers

    C'est simplement parce que l'expérience m'a appris qu'à essayer d'apprendre deux choses à la fois, on fini par tres mal apprendre les deux...:il faut savoir marcher avant de vouloir courrir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut creer un fichier
    jaimerais bien savoir aussi si le code suivant nest pas sensé verifier si le fichier file02.doc existe,et si non le creer à l'emplacement donnée
    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
     
    int fileexist(FILE *liste1)
    {
    	if ( ( liste1=fopen("C:\Programing\file02.doc","a+") )== NULL )
    		{
     
    			liste1=fopen("C:\Programing\file02.doc","a+");
     
    			//fprintf(liste1,"Client List :\n  Name\t\t Address \t\t\t\t Delay\t\t\t\n");
    			printf("return 1\n");
    			return 1;
    		}
    	else return 0;
     
    };
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

  14. #14
    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
    Le mieux serait plutôt de faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int fileexist (FILE * liste1)
    {
       int ret = 0;
     
       if ((liste1 = fopen ("C:\Programing\file02.doc", "r")) == NULL)
       {
          liste1 = fopen ("C:\Programing\file02.doc", "a+");
          ret = 1;
       }
     
       return ret;
    }
    On ouvre d'abord en lecture pour savoir si le fichier existe ce qui dans le cas contraire renvoie bel et bien NULL. Si le fichier n'existe pas il est alors créé.

    En fait, le nom de la fonction est mal choisi (et son utilité également). Une fonction testant si un fichier existe renvoie 0 ou 1 (ou TRUE ou FALSE suivant les langages) mais ne créé en aucun cas le fichier.

    J'aurais plutôt appelé la fonction (et mis sous la forme):
    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
    FILE * open_file (const char * filename)
    {
       FILE * fp = NULL;
     
     
       if (filename != NULL)
       {
          if ((fp = fopen (filename, "r")) == NULL)
          {
             fp = fopen (filename, "a+");
          }
       }
     
     
       return fp;
    }

    Voilà
    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 !

  15. #15
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    sois attentif au fait que l'ouverture d'un fichier avec le parametre a+... crée le fichier s'il n'existe pas...

    De plus, le passage d'un pointeur de type FILE en parametre de cette fonction me parrait... pour le moins scabreux...

    Enfin, à titre personnel, je préfère ouvrir le fichier et tester si ca a réussit en deux étapes (qui, de toutes manières, reviennent au meme au niveau de l'exécution)
    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
     
    FILE* fichier=fopen("fichier.doc","a+");
    /* on teste si le fichier est ouvert (les cas où il ne le serait pas sont réduits ici
       ici ;) */
    if(fichier!=NULL)
    {
        /* si la taille du fichier vaut 0, on peut écrire une entete */
        fseek(fichier, 0, SEEK_END); /* on se place en fin de fichier */
        if(ftell(fichier)==0)
        {
            /** comme l'écriture est toujours susceptible d'échouer, on la
               sécurise */
           int i=fprintf(liste1,"Client List :\n  Name\t\t Address \t\t\t\t Delay\t\t\t\n");
            if(i<0)
            {
                printf("pas su écrire l'entete");
                fclose(fichier);
                return EXIT_FAILLURE;
            }
        }
        else
        {
            /* sinon, il faut s'arranger pour retourner à la dernière info écrite
               pour la récupérer */
        }
     
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je dirais même plus, pour être tout à fait conforme à l'idée d'origine :

    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
    int fileexist (FILE * liste1)
    {
       int ret = 0;
     
       if ((liste1 = fopen ("C:\Programing\file02.doc", "r")) == NULL)
       {
          liste1 = fopen ("C:\Programing\file02.doc", "a+");
          ret = 1;
       }
      else
       {
         fclose(liste1);
         liste1 = fopen ("C:\Programing\file02.doc", "a+");
        }
     
       return ret;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #17
    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 koala01
    sois attentif au fait que l'ouverture d'un fichier avec le parametre a+... crée le fichier s'il n'existe pas...
    Ouais c'est vrai en plus, j'avais même pas percuté sur le coup
    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 !

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par souviron34
    je dirais même plus, pour être tout à fait conforme à l'idée d'origine :

    Sauf que je me pose la question de savoir:
    • Pourquoi s'enquiquiner avec deux ouvertures de fichiers là où une seule suffit amplement (trois en tout, si on ne compte que les appels à fopen sans se soucier de leur position dans les tests... et un fclose )
    • pourquoi renvoyer un int et prendre un FILE en argument... prenons, au mieux, le nom du fichier en argument, et renvoyons directement le FILE (vallant NULL en cas d'erreur )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Attention au '\' qui continue à trainer au lieu de '\\' dans les chemins...

  20. #20
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par koala01
    Sauf que je me pose la question de savoir:
    • Pourquoi s'enquiquiner avec deux ouvertures de fichiers là où une seule suffit amplement (trois en tout, si on ne compte que les appels à fopen sans se soucier de leur position dans les tests... et un fclose )
    • pourquoi renvoyer un int et prendre un FILE en argument... prenons, au mieux, le nom du fichier en argument, et renvoyons directement le FILE (vallant NULL en cas d'erreur )

    je voulais retourner ces nombres afin de differencier trois cas:
    1) le fichier n#a jamais ete créé c'est
    2) le fichier a été créé lors d'une precedente execution du programme ( et sur ce point je crois quand meme que fclose ne supprime pas le fichier,mais juste lepace reservé pour son pointeur), la liste qui y a été sauvegardé doit alors etre charger dans la liste chainée
    3) les etapes 1) et 2) ont deja ete faites, plus besoin du fichier pour avoir acces aux infos precedentes, on ajoute directement a la liste chainée
    la vie est courte vivons chaque instant!

    je ne sais qu'une chose c'est que je ne sais rien!

    NEO.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 40
    Dernier message: 04/11/2016, 17h28
  2. Réponses: 3
    Dernier message: 10/08/2012, 14h24
  3. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32
  4. [Tableaux] Tableau valeur vide pour une clé
    Par hisy dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 11h49
  5. [MASM] Utiliser un .IF pour une comparaison de nombre signés
    Par Crisanar dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 24/11/2004, 16h32

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