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 :

[DEBUTANT] Problème de lecture avec un fscanf


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut [DEBUTANT] Problème de lecture avec un fscanf
    Bonjour tout le monde !

    Voilà je viens expooser ici un problème qui commence à me griller quelques neurones !!

    Je possède un fichier contenant 7 nombres séparés par un espace chacun ;
    Exemple : 0 368 183 34 60 0 0

    Je sougaite lire et "interpréter" ces nombres. Pour ça, j'ai recours à un fscanf ... or si j'enregistre après dans un fichier les variables changées par le fscanf, je m'aperçois en fait que lros de la lecture, seul 1 nombre sur 2 est pris en compte, les autres restant à 0.

    Exemple (complémentaire d'au-dessus) : 0 0 183 0 60 0 0

    Voici mon code complet :

    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
     
     
    //------------------------------------------------------------------------------
    //---- Chargement de la map ----------------------------------------------------
    //------------------------------------------------------------------------------
    void affichageMap(SDL_Surface *ecran, SDL_Surface *background, FILE* map, SDL_Surface *spriteChoisi[])
    {
    //---- Déclaration des variables -----------------------------------------------
    SDL_Rect position, partieRestante;
     
    int choixSprite = 0;
    //------------------------------------------------------------------------------
     
     
    //---- Affichage du Background -------------------------------------------------
    SDL_BlitSurface(background, NULL, ecran, NULL);
    //------------------------------------------------------------------------------
     
    //---- On lit le contenu du fichier & on affiche les sprites -------------------
     
    if(map != NULL)
    {
        while(!feof(map))
        {
        //---- On lit le fichier sprite, abscisse , ordonnée--------------------
        fscanf(map,"%ld %ld %ld %ld %ld %ld %ld\n", &choixSprite, &position.x, &position.y, &partieRestante.w, &partieRestante.h, &partieRestante.x, &partieRestante.y);
        //----------------------------------------------------------------------
     
        //---- On affiche le sprite correspondant ------------------------------
        SDL_BlitSurface(spriteChoisi[choixSprite], &partieRestante, ecran, &position);
        //----------------------------------------------------------------------
        }
        SDL_Flip(ecran);
     
    }
    //------------------------------------------------------------------------------
     
    //---- Fermeture du fichier ----------------------------------------------------
    fclose(map);
    //------------------------------------------------------------------------------
     
    }
    Voilà je pense que vous avez compris mon problème ....

    Dans l'attente d'une réponse,

    Bonne continuation !

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu peux déjà tester le retour de fscanf pour connaître le nombre de conversions réussies.
    De toutes façon, comme d'hab, fscanf est une fonction difficile à utiliser, fais une saisie de la ligne avec fgets et travaille avec strtol qui permet de savoir où s'arrêtent les conversions.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Tu demandes au fscanf de convertir des long (%ld) alors que ta première variable, du moins, est un int. Un %d devrait suffire.
    Sinon, mêmes remarques que Trap D.

    [EDIT]
    avec ce code, ça fonctionne très bien
    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
    int main(int argc, char *argv[])
    {
        int ret = 0 ;
        char ligne1[] = "0 368 183 34 60 0 0\n",
             ligne2[] = "0 0 183 0 60 0 0\n" ;
     
        int choixSprite ;
        SDL_Rect position, partieRestante ;
     
        ret = sscanf(ligne1,"%ld %ld %ld %ld %ld %ld %ld\n", &choixSprite, &position.x, &position.y, &partieRestante.w, &partieRestante.h, &partieRestante.x, &partieRestante.y);
        printf("\n%d champs convertis\n", ret) ;
        printf("  choixSprite = %d\n", choixSprite) ;
        printf("  position.x = %d\n", position.x) ;
        printf("  position.y = %d\n", position.y) ;
        printf("  partieRestante.w = %d\n", partieRestante.w) ;
        printf("  partieRestante.h = %d\n", partieRestante.h) ;
        printf("  partieRestante.x = %d\n", partieRestante.x) ;
        printf("  partieRestante.y = %d\n", partieRestante.y) ;
     
        ret = sscanf(ligne2,"%ld %ld %ld %ld %ld %ld %ld\n", &choixSprite, &position.x, &position.y, &partieRestante.w, &partieRestante.h, &partieRestante.x, &partieRestante.y);
        printf("\n%d champs convertis\n", ret) ;
        printf("  choixSprite = %d\n", choixSprite) ;
        printf("  position.x = %d\n", position.x) ;
        printf("  position.y = %d\n", position.y) ;
        printf("  partieRestante.w = %d\n", partieRestante.w) ;
        printf("  partieRestante.h = %d\n", partieRestante.h) ;
        printf("  partieRestante.x = %d\n", partieRestante.x) ;
        printf("  partieRestante.y = %d\n", partieRestante.y) ;
     
      return 0 ;
    }
    Nota : J'ai utiliser sscanf, car je n'ai pas la structure de ton fichier.
    N'aurais-tu pas un problème dans l'écriture des variables dans ton fichier ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Merci de vos réponses.

    Ce qui m'étonne, c'est que pour l'enregistrement du fichier, j'ai fait exactement la même chose, mais avec un fprintf, et ça fonctionne très bien !

    Elijha > Le problème de la solution que tu me proposes, c'est que tu lis une chaîne et nonp pas un fichier. Or je dois lire ces fichiers, je ne peux pas tout stocker en mémoire ... je vais me pencher quand même dans cette direction pour voir un peu si je peux faire qqch

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    ben tu fais un fgets suivi d'un sscanf...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Grr je ne vois vraiment le problème ... voilà mon code maintenant avec un fgets suivi d'un sscanf ... toujours le même problème !!

    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
     
    //------------------------------------------------------------------------------
    //---- Chargement de la map ----------------------------------------------------
    //------------------------------------------------------------------------------
    void affichageMap(SDL_Surface *ecran, SDL_Surface *background, FILE* map, SDL_Surface *spriteChoisi[])
    {
    //---- Déclaration des variables -----------------------------------------------
    SDL_Rect position, partieRestante;
     
    int choixSprite = 0;
    char lecture[30] = {0};
    //------------------------------------------------------------------------------
     
     
    //---- Affichage du Background -------------------------------------------------
    SDL_BlitSurface(background, NULL, ecran, NULL);
    //------------------------------------------------------------------------------
     
    //---- On lit le contenu du fichier & on affiche les sprites -------------------
     
    if(map != NULL)
    {
        while(!feof(map))
        {
        //---- On lit le fichier sprite, abscisse , ordonnée------------------------
        fgets(lecture, sizeof(lecture), map);
        //--------------------------------------------------------------------------
     
        //---- Conversion des données recueillies en fgets -------------------------
        sscanf(lecture, "%d %d %d %d %d %d %d\n", &choixSprite, &position.x, &position.y, &partieRestante.w, &partieRestante.h, &partieRestante.x, &partieRestante.y);
        //--------------------------------------------------------------------------
     
        //---- On affiche le sprite correspondant ----------------------------------
        SDL_BlitSurface(spriteChoisi[choixSprite], &partieRestante, ecran, &position);
        //--------------------------------------------------------------------------
        }
        SDL_Flip(ecran);
     
    }
    //------------------------------------------------------------------------------
     
    //---- Fermeture du fichier ----------------------------------------------------
    fclose(map);
    //------------------------------------------------------------------------------
     
    }
    Cette fois, si après je fais un fprintf pour voir ce qui a été converti .... toujours le même problème, 1 valeur sur 2. Mais si je fais un fprintf de la chaïne %s lecture, ça m'affiche bien ce qu'il est censé y avoir !

    Merci de votre aide !

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

Discussions similaires

  1. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40
  2. [DEBUTANT]Problème de deployement avec web.xml
    Par kore62 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 06/08/2007, 14h54
  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. Réponses: 6
    Dernier message: 12/06/2006, 16h38
  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