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 :

Ecriture dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 168
    Par défaut Ecriture dans un fichier
    bonsoir,

    j'ai 2 procédures , créer(), et afficher().

    créer : créer un fichier et ajoute un enregistrement
    afficher: affiche ce que le fichier contient.

    voila 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
     
    #include<stdio.h>
    #include <string.h>
    # include <fstream.h> 
    #include<conio.h>
       #include <stdlib.h>
     
    typedef struct regle{char condition[9]; int action;
                      float fit;
    	    }regle;
     regle r;
     
       FILE * in;
     
     
    /*********************************************/
      void affich()
      {      
     
    	 in=fopen("so.$$$","r");
     
     
    		while(!feof(in))
    		 {
    		       fread(&r,sizeof(regle),1,in);
     
     
                            printf("%s",r.condition);
                           printf("  ");
                            printf("%d",r.action);
                            printf("  ");
                            printf("%f",r.fit);
     
    		  }
     
    		fclose(in);
     }
     
     /*************************************/
     void creat()
    {
      in=fopen("so.$$$","w");
      fin=false;
     
               scanf("%s",r.condition );
               scanf("%d",&(r.action));
               scanf("%f",&(r.fit));
     
               fwrite(&r,sizeof(regle),1,in);
     
               fclose(in);
    }
     
      main()
     {
     creat();
     affich();
      getchar();
      getchar();
    }
    lors de l'affichage je trouve l'enregistrement est affiché 2 fois !!!!!!!

    j'ai exécuté avec f8 , j'ai trouver que le compilateur entre dans la boucle de l'affichage 2 fois pourtant il y a un seul enregistrement !!!!!!

    merci d'avance

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Mauvaise utilisation de feof(), feof() indique si la fin de fichier a ete atteinte suite a une erreur de lecture.

    Ici, tu rentres une premiere fois dans la boucle et tu lis l'enregistrement.
    Puis, fread() n'ayant pas rencontrer d'erreur, feof() n'indique pas que la fin de fichier a ete atteinte et tu rentre nouveau dans la boucle.

    La solution consiste a ne pas utiliser feof() pour arreter la boucle mais a utiliser la valeur de retour de fread().
    Ce qui resoud egalement un probleme de boucle infinie rencontre dans le cas d'une erreur de lecture differente de fin de fichier.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 168
    Par défaut
    merci pour ta réponse

    j'ai fait ça et ça marche maintenant
    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
     
    void affich()
      {     
     
    	 in=fopen("so.$$$","r");
     
    		while(fread(&r,sizeof(regle),1,in)!= 0)
    		 {		   
                          printf("%s",r.condition);
                           printf("  ");
                            printf("%d",r.action);
                            printf("  ");
                            printf("%f",r.fit);
                            printf("\n");
    		  }
     
    		fclose(in);
     }
    mais est ce que c'est juste ce que j'ai fait ou je n'ai pas compris ta réponse ???

    car j'ai trouver ça dans l'aide :

    On success fread returns the number of items (not bytes) actually read.

    On end-of-file or error it returns a short count (possibly 0).

    possibly 0 : c'est à dire que ce n'est pas toujours 0 ??? ou quoi exactement !!!!!

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par info_amel Voir le message
    mais est ce que c'est juste ce que j'ai fait ou je n'ai pas compris ta réponse ???
    Non c'est ca, par contre, il faut verifier si l'ouverture du fichier s'est correctement passe avant d'utiliser le fichier.

    Citation Envoyé par info_amel Voir le message
    car j'ai trouver ça dans l'aide :

    On success fread returns the number of items (not bytes) actually read.

    On end-of-file or error it returns a short count (possibly 0).

    possibly 0 : c'est à dire que ce n'est pas toujours 0 ??? ou quoi exactement !!!!!
    Dans ton exemple, en cas d'erreur tu recois bien 0 car tu ne lis qu'un seul element.

    Par contre si tu demandes de lire n element et si fread() rencontre une erreur, il va retourner le nombre d'element correctement lu qui sera inferieur a n mais pas forcement nul (par exemple si tu demandes a lire 5 elements mais qu'il n'y en a plus que 2 dans le fichier, fread() va retourner 2 et non 0).

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 168
    Par défaut
    merci

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

Discussions similaires

  1. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  2. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 22h48
  3. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46
  4. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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