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 :

Éviter de lire des caractères avec fscanf()


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Éviter de lire des caractères avec fscanf()
    Bonjour,

    Je bloque un peu sur un exercice, voici la partie de code qui pose problème, je ne pense pas que le reste du code soit nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FILE * fich = fopen(file, "r") ;
    if (!fich) return 1 ;
    int max, lu, nombres[11] ;
    for (max = 0 ; max < 11 && lu != EOF ; max++)
    	lu = fscanf(fich, "%d", & nombres[max]) ;
    file est un fichier qui contient une suite de nombres, normalement 10 au maximum.

    Le programme marche bien dans ce cas, fscanf lit chaque nombre jusqu'au dernier tour de boucle.

    Par contre si un caractère se glisse dans le fichier file, évidemment comment fscanf s'attend à trouver des décimaux (%d) ça déconne.

    Et c'est justement là que je bloque car le programme doit gérer ce cas de figure, si possible ignorer les caractères.

    Je suis bloqué ici, si quelqu'un à une idée pour me mettre sur la voie je ne dis pas non.

    Merci d'avance !!

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Ca dépend de ce que l'on t'a demandé de gérer et comment le gérer !

    En soi, si le fichier en entrée n'est pas dans le bon format... eh bein ça ne doit pas marcher !
    Ou alors on doit te donner des specs plus précises...

    Tu peux déjà commencer par sauvegarder la position du curseur avant chaque fscanf afin de pouvoir repartir en arrière si nécessaire, et lire moins de caractères...
    Mais bon... si il est écrit : 42
    Que quelqu'un ajoute un 'a' comme ça : 4a2
    Quelle est la directive à suivre ? Lire 4, puis lire du caractère, puis 2, et faire 4 concaténé à 2 ? Ou prendre juste 4 ?

    Il y a pleins de façons de faire, tu peux te débrouiller pour faire une liste de "nombres", et dès que tu as fini d'extraire tous tes "bouts" de nombres, tu les concatènes, puis tu atoi !

  3. #3
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir,
    déjà tu accèdes à lu sans l'avoir initialisé au premier tour de boucle (ça marche = coup de bol).
    ensuite fscanf ne renvoie pas EOF mais le nombre de conversions réussies. Dans ton cas c'est soit 1 (on a réussi à lire un entier), soit 0 (on a pas réussi).
    Normalement 10 au maximum ... c'est une estimation ou c'est fixe ????
    Si ce n'est pas fixe il vaut mieux trouver une autre limite, et si c'est fixe autant en faire un #define.

    Citation Envoyé par Self-Mao Voir le message
    Le programme marche bien dans ce cas, fscanf lit chaque nombre jusqu'au dernier tour de boucle.

    Par contre si un caractère se glisse dans le fichier file, évidemment comment fscanf s'attend à trouver des décimaux (%d) ça déconne.

    Et c'est justement là que je bloque car le programme doit gérer ce cas de figure, si possible ignorer les caractères.

    Je suis bloqué ici, si quelqu'un à une idée pour me mettre sur la voie je ne dis pas non.

    Merci d'avance !!
    Avec ma précédente remarque tu peux commencer à implémenter une solution. Si lu vaut 0 alors :
    soit on est en fin de fichier que tu vérifies avec un feof, soit il y a une erreur que tu vérifies avec ferror, soit c'est aucun des deux cas et tu es tombé sur quelque chose qu'on ne peut transformer en entier.
    Le plus simple ne serait-il pas de lire une chaine que tu essaieras de transformer en entier par la suite ??? cela te permettrait une gestion plus fine des erreurs à première vue je pense.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pour bien comprendre scanf et ses amies : http://xrenault.developpez.com/tutoriels/c/scanf/

Discussions similaires

  1. lire des caractères
    Par soria_t dans le forum C
    Réponses: 5
    Dernier message: 23/02/2007, 12h20
  2. Lire des byte avec Scanner
    Par ToTo13 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 25/01/2007, 15h56
  3. [Système] supprimer des caractères avec preg_replace
    Par Fritzoune dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2006, 13h59
  4. Lire des chiffres avec les virgules
    Par stiko dans le forum C++
    Réponses: 4
    Dernier message: 19/07/2006, 23h04
  5. [ZIP]besoin de lire des fichiers avec l'extension tar.gz
    Par mathieublanc13 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 24/05/2004, 13h35

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