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 :

lecture de fichier C


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
    Collégien
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Albanie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut lecture de fichier C
    Bonjour,


    Je veux lire un fichier qui a le format suivant:

    chaine de 30 caracteres pour le nom, suivi d'un float, suivi d'un float
    Exemple:

    sylvie pierre 2,5 3,40
    marie claude 3,1 10
    pierre carl 10 12

    Au début, j'ai fait le code que vous allez voire plus bas mais le résultat retourné n'est pas bon.
    J'ai réussi à lire le fichier en utilisant un autre code (en utilisant seulement fscanf) mais ma question est pourquoi le code suivant ne permet pas de lire les données correctement?

    Voilà le code réalisé, l'idée est de lire la chaine de 30 caractères et ensuite de lire le reste de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	while(fgets(tmpNom,30, fichEmp  )!= NULL)
    	{
    		fscanf(fichEmp, "%c %f %f\n", &tmpPoste, &tmpTauxH, &tmpHeureS );			
    				printf("**** %s\n", tmpNom);
    				printf("-----%c %f %f\n", tmpPoste, tmpTauxH, tmpHeureS);
     
    			}

    Le resultat:
    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
     
    **** Tremblay Alain
    -----  0.000000 0.000000
    **** A 35.0 35.5
     
    -----V 0.000000 0.000000
    **** achon Jean
    -----P 40.000000 22.750000
    **** Lapalme Justin
    -----  40.000000 22.750000
    **** O 40.0 15.75
     
    -----D 40.000000 22.750000
    **** eschenes Sylvie
    -----P 35.000000 25.000000
    **** Lachance Carl
    -----  35.000000 25.000000
    **** O 37.5 18.0
     
    -----  35.000000 25.000000
    Merci

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Vérifie le retour de ton fscanf, ton code est faux à cet endroit là je pense, mais honnêtement il vaut mieux:

    - Utiliser fgets pour lire toute la ligne
    - Ensuite à partir du 30ème caractère utiliser strtof pour faire ce que tu veux et faire de la vérification d'erreur

  3. #3
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut
    Déja, la il y a un probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fgets(tmpNom,30, fichEmp  )!= NULL)
    fgets va lire toute la ligne ou num-1 caractères.
    Les noms et prénoms que tu donnes en exemple ne font pas 29 caractères ( 30 - 1 pour nul de fin de ligne) . Peut être les as tu écrit dans le fichier á partir d'un tableau de 30 char (char[30]), mais les noms ne prendront pas la place de 30 caractères pour autant dans le fichier, pas en mode texte.

    Par exemple cette ligne "sylvie pierre 2,5 3,40", fait 23 caractères. Ce qui veut dire que tu vas remplir tmpNom avec toute la ligne, chiffres compris, et le stream du fichier va se déplacer au début de la ligne suivante. Et ensuite tu cherche á lire les nombres avec fscanf, c'est pas bon.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fichEmp, "%c %f %f\n", &tmpPoste, &tmpTauxH, &tmpHeureS );
    Le formateur %c ne lit qu'un seul caractère. Essaye avec %s et tmpPoste.

    Quelque chose m'échappe dans ton fgets() suivi de fscanf(). Tu peux tout lire avec fscanf(). Cette entrée de la FAQ devrait t'aider : http://c.developpez.com/faq/?page=St...-une-structure

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ce n'est pas un problème d'utiliser fgets pour lire partiellement la ligne. saghaagenc a dit au début que sa chaîne faisait 30 caractères donc ce n'est pas un souci. Je pense que le problème vient plutôt de quelques suppositions:

    - La chaîne de 30 caractères, y-a-t-il un '\0' dans les 30?
    - Sans relire la page man, il me semble que fgets va s'arrêter dans ton cas u 29ème caractère et ajouter un '\0' à la chaîne

    - Ensuite pourquoi le %c pour le fscanf est une bonne question: cela n'était pas présenté dans ta ligne exemple

    Enfin et malgré le fait que tu peux faire un fgets + fscanf comme tu le dis, je pense vraiment qu'un seul fgets avec ensuite une copie des 30 premiers caractères et deux strtof avec les vérifications d'erreurs est plus sûr que ce que tu es en train de faire.

  6. #6
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Ce n'est pas un problème d'utiliser fgets pour lire partiellement la ligne. saghaagenc a dit au début que sa chaîne faisait 30 caractères donc ce n'est pas un souci. Je pense que le problème vient plutôt de quelques suppositions:
    Il dit que les chaines font 30 chars mais les exemples qu'il montre sont différents. Pour que les chaines fassent 30 chars il faudrait qu'il rajoute par exemple des espaces á la fin. Ce qui ne semble pas être le cas. Je pense que peut être il s’embrouille concernant la taille des chaines nom et prenom, ou alors les exemples qu'il montre ne sont pas exacts.

    exemples qu'il donne :
    sylvie pierre 2,5 3,40
    marie claude 3,1 10
    pierre carl 10 12

    exemple pour faire 30 chars avec padding:
    sylvie pierre <----------------------------> 3.4 5.6

    Ne pas oublier également que fgets garde le char de fin de ligne '\n' et lit n-1 chars pour le '\0' de fin de ligne. Les chaines doivent donc faire 29 chars max.

    Le plus simple et le plus performant dans ce genre de situation c'est de lire chaque ligne avec 1 appel á fscanf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FILE* stream;
    char nom[24] = {0};
    char prenom[24] = {0};
    float f1, f2;
     
    fscanf(stream, "%s%s%f%f\n", nom, prenom, &f1, &f2);
     
    char nom_et_prenom[48] = {0};
    sprintf(nom_et_prenom, "%s %s", nom, prenom);
    Le plus robuste c'est de faire comme 'fearyourself' dit.

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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