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 :

problème de lecture avec fscanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant informatique
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Etudiant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Par défaut problème de lecture avec fscanf
    problème de lecture avec scanf quand je utilise fgets pour lire des données d'un utilisateur.
    Salut , quelqu'un peut m'aider a résoudre ce problème . J'arrive a écrire dans un fichier mais la lecture n'est pas bon car j'ai utiliser des chaine avec espace .

    Mon programme n'est pas encore terminer car je doit ajouter deux autre fonction modifier/supprimer des conseille pour eux si c'est possible
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //---------->structure<------------//
    typedef struct
    { int   N;
      char  Nom[30];
      char  prenom[30];
      char  adresse1[40];
      char  adresse2[40];
      char CodePostal[5];
      char ville[34];
    }client;
    //------------->partie : Prototype <-------------//
    void insere();
    void afficher();
    int Lire(char *chaine , int longueur);
    void viderBuffer();
    //------------->Fonction principale<-------------//
    int main(void)
    {   int choix , rep;  
      do
      { printf("MENU\n");
        printf("1-Insere un client\n");
        printf("2-afficher les client\n");
        printf("choix : ");
        scanf("%d",&choix);
        switch(choix)
        { case 1 :   insere(); break;
          case 2 : afficher(); break;
          default: printf("choix incorrecte\n");
        }
        printf("vous voulez faire une autre operation ? 1/0");
        printf("choix : ");
        scanf("%d",&rep);
      }while(rep==1);
        return 0;
    }
    //----------------->declaration de la structure<---------//
    client c;
    //-----------------> partie : Fonction <----------------//
        //------------->fonction eliminer \n <--------------//
    int Lire(char *chaine , int longueur)
    {
      char *positionEntree = NULL;
     
      if(fgets(chaine, longueur , stdin ) !=NULL )
      {
        positionEntree = strchr(chaine, '\n');
        if(positionEntree != NULL)
        {
           *positionEntree = '\0';
        }
        else
        {
          viderBuffer();
        }
        return 1;
      }
      else
      {
         viderBuffer();
         return 0;
      }
    }
        //------------->fonction : si on dépasse le nombre de caractere max<------//
    void viderBuffer()
    {
       int c = 0;
       while(c != '\n' && c != EOF)
       {
          c = getchar();
       }
    }
     
      //--------------->Fonction ajouter<----------------//
     
     
    void insere()
    { int NbrCliAjouter = 0  ,i ;
       int NClientTotal=0;
      FILE *fic ;
     
      fic = fopen("client.txt","a");
     
        if(fic == NULL)
          { printf("Erreur du fichier client.txt");
            exit(1);
          }
     
     
      printf("Donnr le nombre de client a ajouter");
      scanf("%d",&NbrCliAjouter);
     
      NbrCliAjouter=NbrCliAjouter+NClientTotal;
     
      fflush(stdin);
     
      for(i=NClientTotal;i<NbrCliAjouter;i++)
      { printf("entrer le Nom :");
        Lire(c.Nom , 30);
        printf("entrer le prenom :");
        Lire(c.prenom , 30);
        printf("entrer le adresse1 : ");
        Lire(c.adresse1 , 40);
        printf("entrer le adresse2 : ");
        Lire(c.adresse2 , 40);
        printf("entrer le Code postale :");
        Lire(c.CodePostal , 5);
        printf("entrer la ville :");
        Lire(c.ville , 34);
     
       c.N = i+1;
     
       fprintf(fic,"%d %s %s %s %s %s %s\n",c.N,c.Nom,c.prenom,c.adresse1,c.adresse2,c.CodePostal,c.ville);
      }
     
      fclose(fic);
        }
    //-------------------->fonction de afficher <-------------//
    void afficher()
    {FILE *fic;
     
        fic = fopen("client.txt","r");
          if(fic == NULL)
          { printf("Erreur du fichier client.txt");
          exit(1);
          }
      while(fscanf(fic,"%d %s %s %s %s %s %s\n",&c.N,c.Nom,c.prenom,c.adresse1,c.adresse2,c.CodePostal,c.ville) != EOF)
          {
            printf("N :%d\nNOM: %s\nPRENOM: %s\nDRESSE1: %s\nADRESSE2: %s\n CODEPOSTAL: %s\nVILLE: %s\n",c.N,c.Nom,c.prenom,c.adresse1,c.adresse2,c.CodePostal,c.ville) ;
          }
      fclose(fic);    
     
    }

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut
    C'est normal, scanf s'arrête quand il y a un espace.

    Pour lire et écrire les enregistrements, lis ou écrits directement ta structure client dans le fichier.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Si on utilise l'espace pour séparer les champs et les champs contiennent des espaces, il n'y a plus moyen de distinguer qui est qui. On doit changer quelque chose.
    * utiliser en séparateur de champs un caractère qui ne sera jamais dans les textes.
    * empêcher d'avoir dans les textes, le caractère qui sert de séparateur
    * remplacer dans les textes le caractère qui sert de séparateur par autre chose
    * on peut aussi utiliser un format binaire, ou des systèmes d'encodage.

    Par exemple, on pourrait remplacer les espaces par le caractère de souligné juste avant transfert vers le fichier et effectuer la conversion inverse juste après lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void remplacer(char* str, char avant, char apres) {
       while ( *str != '\0' ) {
          if ( *str == avant )
             *str = apres;
          ++str;
       }
    }
    Et on évite aussi ainsi le problème que "%s" détecte les espaces comme des séparateurs.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant informatique
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Etudiant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Par défaut problème de lecture avec fscanf
    salut Merci pour ta réponse juste que je ne suis pas super avancer encore en c .
    en vrai je ne sais pas écrire en binaire , si tu peux m'aider ou je peux mettre la fonction remplace

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut
    Tout fichier est binaire. Schématiquement, les fichiers textes sont juste des fichiers dont les codes binaires sont compris dans la plage a-z A-Z 0-9 et les caractères de ponctuation.

    Il te suffit de passer ta variable client à fwrite (ainsi que la taille de la structure) pour écrire le contenu de la structure dans le fichier. Ce contenu sera récupérable par l'opération inverse avec fread. Par contre, le fichier ne sera pas lisible par un éditeur de texte, car il sera justement écrit en binaire, si certains codes sont dans la plage des codes lisible, comme les chaines de caractère, tu pourras les lire, mais les champs numérique, tu ne pourras pas les lire.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Etudiant informatique
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Etudiant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Par défaut
    Merci pour ta réponse,
    Seulement une question si je utilise cette méthode binaire , je peux crée un mini programme facile comme (un carnet des note pour client avec fichier..)? et et ce que c'est plus facile que le texte ?.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2010, 09h27
  2. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40
  3. Problème de lecture avec un player audio ouvert par SWFobject
    Par ceddus dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/06/2007, 04h47
  4. [DEBUTANT] Problème de lecture avec un fscanf
    Par Pingouin dans le forum C
    Réponses: 26
    Dernier message: 28/05/2006, 18h10
  5. [DOM] Problème de lecture avec DOM
    Par samios dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 29/09/2004, 15h58

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