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 :

Principe du fscanf ? [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut Principe du fscanf ?
    Bonjour,

    J'aimerais récupérer 3 valeurs (X, Y, Z) bien précises dans un fichier. Ces valeurs se situent n'importe où (en mileu de ligne par ex) dans le fichier mais toujours derrière les caractères COM :

    Pour résumer, voici ce que pourrait être mon fichier :
    sdfdsfdssdf fdsfsdfds fdsfdsf fdssdf
    fdsfsdf sd sdfdsfsd COM : X Y Z fdfgdfgdfg gdfgdfg dfgdfg
    dfgdfg

    dans mon prog, j'ai écris notamment ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fscanf (f, "COM : %d %d %d, &X, &Y, &Z);
    printf("X = %d , Y = %d , Z=%d\n", X, Y, Z);
    Résultat :
    - Il me ramène bien les valeurs quand mon fichier commence par COM : X Y Z dffsfg gfdgdf gdff....
    - Il me ramène des 0 dans tous les autres cas de figure.

    Je ne comprends pas bien pourquoi...

    Merci de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    Citation Envoyé par Sinon
    dans mon prog, j'ai écris notamment ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fscanf (f, "COM : %d %d %d, &X, &Y, &Z);
    printf("X = %d , Y = %d , Z=%d\n", X, Y, Z);
    Résultat :
    - Il me ramène bien les valeurs quand mon fichier commence par COM : X Y Z dffsfg gfdgdf gdff....
    - Il me ramène des 0 dans tous les autres cas de figure.

    Je ne comprends pas bien pourquoi...
    peut être tu as oublié un " dans la premiere ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fscanf (f, "COM : %d %d %d", &X, &Y, &Z);
    printf("X = %d , Y = %d , Z=%d\n", X, Y, Z);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    non, non, c'est une erreur de frappe dans mon message.
    Sans ce " il ne me retournerait jamais rien.

  4. #4
    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
    Citation Envoyé par Sinon
    Résultat :
    - Il me ramène bien les valeurs quand mon fichier commence par COM : X Y Z dffsfg gfdgdf gdff....
    - Il me ramène des 0 dans tous les autres cas de figure.

    Je ne comprends pas bien pourquoi...

    Merci de votre aide
    Parce que c'est le fonctionnement normal de la fonction.

    Ce que tu veux faire c'est parcourir ton fichier, trouver "COM :" et ensuite récupérer les valeurs. Ce n'est donc pas la bonne facon de faire.

    Un algorithme possible serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Lire une ligne du fichier avec fgets
    Regarder si on a une entrée " COM : " avec la fonction strstr
    Si oui, utiliser sscanf, ou encore mieux strtol sur cet endroit pour récupérer la valeur.
    Pour ces 4 fonctions, je te conseille de lire les pages man :
    http://man.developpez.com

    Jc

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    Merci
    Je pensais que la fonction fscanf permettait de le faire de façon plus simple.

    Je vais tester ton algo...

    Pourrais-tu m'expliquer pourquoi cela ne marche pas avec fscanf ? Pourquoi il me renvoit 0 ?

  6. #6
    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
    Citation Envoyé par Sinon
    Merci
    Je pensais que la fonction fscanf permettait de le faire de façon plus simple.

    Je vais tester ton algo...

    Pourrais-tu m'expliquer pourquoi cela ne marche pas avec fscanf ? Pourquoi il me renvoit 0 ?
    Parce qu'il essaie de comparer ton format avec ce qu'il voit dans le fichier.

    Ainsi,

    sadf asdf asf COM : X Y Z
    ne correspond pas à :

    COM : X Y Z
    Il répond donc par un 0 pour dire, je n'ai rien pu faire.

    Jc

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    Ne devrait-il pas scaner la chaine "COM : ......." dans tout le fichier ?
    Qu'importe ce qu'il y a devant. Je lui précise ce qu'il doit trouver derrière.
    C'est comme ça que je l'avais compris. Mais j'ai dû me tromper alors.

  8. #8
    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
    Citation Envoyé par Sinon
    Ne devrait-il pas scaner la chaine "COM : ......." dans tout le fichier ?
    Qu'importe ce qu'il y a devant. Je lui précise ce qu'il doit trouver derrière.
    C'est comme ça que je l'avais compris. Mais j'ai dû me tromper alors.
    De la page man :
    http://man.developpez.com/man3/fscanf.3.php

    L'examen de l'entrée s'arrête dès qu'un caractère d'entrée ne correspond pas à un caractère du format.
    Jc

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Sinon
    Je pensais que la fonction fscanf permettait de le faire de façon plus simple.
    <...>
    Pourrais-tu m'expliquer pourquoi cela ne marche pas avec fscanf ? Pourquoi il me renvoit 0 ?
    Peu de gens maitrisent *scanf(), qui n'est une fonction ni pour les débutants, ni même les confirmés. Si tu y tiens, étudie ceci :

    http://xrenault.developpez.com/tutoriels/c/scanf/

    Mais cette famille de fonction attendant une entrée formatée, elle est inadaptée à ton cas qui est tout sauf formaté...

    C'est pour ça que les algos proposés commencent par un recherche de 'synchronisation'.

    Attention, si "COM" est en fin de ligne ou à cheval sur 2 lignes ("C\nOM") ou pareil pour les données, ça ne fonctionnera pas. Il faut peut être traiter caractères par caractères avec un automate d'analyse...

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Sinon
    J'aimerais récupérer 3 valeurs (X, Y, Z) bien précises dans un fichier. Ces valeurs se situent n'importe où (en mileu de ligne par ex) dans le fichier mais toujours derrière les caractères COM :

    Pour résumer, voici ce que pourrait être mon fichier :
    sdfdsfdssdf fdsfsdfds fdsfdsf fdssdf
    fdsfsdf sd sdfdsfsd COM : X Y Z fdfgdfgdfg gdfgdfg dfgdfg
    dfgdfg
    Il faut lire le fichier ligne par ligne, avec fgets(), puis chercher COM avec strstr(), puis analyser la suite, par exemple avec sscanf().

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  2. [HARDWARE] Principe de fonctionnement d'un touchpad
    Par Cyspak dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 26/12/2003, 01h47
  3. barre de menu principal
    Par norfelt dans le forum IHM
    Réponses: 10
    Dernier message: 27/10/2003, 11h37
  4. projet suivant le principe de MSN
    Par Walm dans le forum Développement
    Réponses: 2
    Dernier message: 30/09/2003, 12h36
  5. Directive, principe delphi
    Par Arrown dans le forum Débuter
    Réponses: 3
    Dernier message: 09/09/2003, 18h32

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