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 :

Fichier et Fonction d'incrementation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut Fichier et Fonction d'incrementation
    J'ai ecrit une fonction qui va lire dans un fichier un nombre, puis l'incrémente et met à jour le fichier avec ce nouveau chiffre.
    Clairement, ça me permet d'avoir une fonction d'incrémentation qui stok en dur le dernier nombre.

    Voilà ce que ça donne :

    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
    long Increment(char const * const filename)
    {
    	FILE *myFile;
    	long myCount = 0;
    	char msg[512];
     
     
    	myFile = fopen(filename, "r");
    	if (myFile != NULL) 
    	{
    		fseek( myFile, 0, SEEK_SET);
    		fgets( msg, sizeof(msg), myFile);
    		if(msg!=NULL)
    		{
    			// string to long
    			sscanf(msg, "%d", &myCount);
    		}
    		fclose(myFile);
    	}
     
    	myCount++;
     
    	// long to string
    	sprintf(msg, "%d", myCount);
     
    	myFile = fopen(filename, "w");
    	if (myFile != NULL) 
    	{
    		fwrite(msg, strlen(msg), 1, myFile);
    		fclose(myFile);
    	}
     
     	free(msg);
     
    	return myCount;
     
    }
    Avez-vous des suggestions pour simplifier le schmilblick ?

  2. #2
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par kendras
    J'ai ecrit une fonction qui va lire dans un fichier un nombre, puis l'incrémente et met à jour le fichier avec ce nouveau chiffre.
    Clairement, ça me permet d'avoir une fonction d'incrémentation qui stok en dur le dernier nombre.

    Voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    long Increment(char const * const filename)
    {
    	FILE *myFile;
    	long myCount = 0;
    	char msg[512];
     
     
    	myFile = fopen(filename, "r");
    	if (myFile != NULL) 
    	{
    		fseek( myFile, 0, SEEK_SET);
    		fgets( msg, sizeof(msg), myFile);
    		if(msg!=NULL)
    Attention, msg est le buffer que tu remplis, pas le retour de fgets(). Si fgets() renvoie NULL, msg sera toujours != NULL lui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      /* fseek() inutile ici */
                            if ( fgets(msg, sizeof(msg), myFile) ) {
    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		{
    			// string to long
    			sscanf(msg, "%d", &myCount);
    strtol() sera mieux. Ca sied bien en plus à la variable myCount qui est un long. Pour aller vite et voir en mode debug, tu peux utiliser assert pour ce genre de verif. Et accessoirement verifier que myCount n'est pas une borne limite (LONG_MIN ou LONG_MAX, voir limits.h pour ça). Si tu utilies *scanf(), mets bien le bon specificateur de format pour le type attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                /* Use strtol() instead ;) */
                                         /* Avec sscanf c'est %ld pour un long int*/
                                         myCount = strtol(msg, NULL, 10);
                                         assert(errno != ERANGE); /* inclure assert.h et errno .h */
                              }
    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    		fclose(myFile);
    	}
     
    	myCount++;
     
    	// long to string
    	sprintf(msg, "%d", myCount);
    Attention si myCount vaut LONG_MAX, peu probable mais ne sait-on jamais .

    rebelote, %ld pour un long int avec sprintf().

    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	myFile = fopen(filename, "w");
    	if (myFile != NULL) 
    	{
    		fwrite(msg, strlen(msg), 1, myFile);
    		fclose(myFile);
    	}
     
     	free(msg);
     
    	return myCount;
     
    }
    Avez-vous des suggestions pour simplifier le schmilblick ?
    Ro, tu fais un fwrite pour du fichier texte !? Ce n'est pas que c'est pas correct mais c'est pas très coherent avec un fichier ouvert en mode texte. Le pb c'est que tu ne l'utilises pas comme il faut.
    fwrite(msg, sizeof*msg, strlen(msg) + 1, myFile);
    Mais c'est tordu.
    fprintf(myFile,"%s", msg); c'est mieux. Tant que tu ne fais pas l'inverse (utilisation fonctions ecriture/lecture formates sur fichiers ouverts en mode binaire...).

    Que vois-je, un free sur un tableau automatique !!

    A+

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    myFile = fopen(filename, "r");
    ...
    fclose(myFile);
    ...
    myFile = fopen(filename, "w");
    ...
    fclose(myFile);
    Ou directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    myFile = fopen(filename, "r+");
    ...
    fclose(myFile);

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Merci pour tous ces précieux conseils que j'ai mis en application

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

Discussions similaires

  1. Ouvrir un fichier en fonction d'un autre
    Par philippef dans le forum Langage
    Réponses: 7
    Dernier message: 05/03/2006, 17h42
  2. Script de suppression de fichiers en fonction de la date
    Par yellow174 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 06/02/2006, 11h57
  3. [SQL] Comment réaliser une fonction d'incrementation ?
    Par da_latifa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/12/2005, 11h14
  4. Réponses: 2
    Dernier message: 03/06/2005, 11h01
  5. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35

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