Probleme avec fscanf .

Résolu
dragondort Messages postés 6 Statut Membre -  
dragondort Messages postés 6 Statut Membre -
Bonjour, Je suis débutant en C, et je bloque sur un code.

Le voila:

#include <stdio.h>
#include <stdlib.h>
#define MAXLONGUEURLIGNEMENU 50

int AfficherMenu(void)
{
    FILE* fichier = NULL;
    //char lignemenu[MAXLONGUEURLIGNEMENU];
    int i;
    /* Les 4 Parametre */
    int a1;
    int a2;
    char hotkey;
    char nomdeligne[MAXLONGUEURLIGNEMENU];

    fichier = fopen("menu.ini", "r+");

    if (fichier != NULL)
    {
        // On peut lire et écrire dans le fichier
        printf("Ouverture réussie !!! ^^ \n\n");

        i=0;
        do{
        fscanf(fichier, "%d;%d;%c;%s", &a1, &a2, &hotkey, nomdeligne);
        //fgets(lignemenu, MAXLONGUEURLIGNEMENU, fichier);
        printf("Nombre 1 : %d\nNombre 2 : %d\nHotkey : %c\nNom de la ligne : %s\n\n", a1, a2, hotkey, nomdeligne);
        i++;
        }while(i<3);
        fclose(fichier);
    }

    else
    {
        // On affiche un message d'erreur si on veut
        printf("Impossible d'ouvrir le fichier test.txt");
    }

    return 0;
}



Mon problème vient du fscanf, je ne sais pas comment faire pour passer a la ligne suivante de mon fichier menu.ini
Il s'agence comme suit :

1;0;N;[N]ouveau Fichier;
1;1;O;[O]uvrir;
1;2;Q;[Q]uitter;
2;0;C;Fichier [C];
2;1;T;Fichier [T]exte;
Configuration: Windows XP
Firefox 2.0.0.14
Mon Compilateur : GCC
éditeur de code : Code::Blocks

5 réponses

  1. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    essaye en rajoutant le ";" de fin de ligne
    fscanf(fichier, "%d;%d;%c;%s;", &a1, &a2, &hotkey, nomdeligne);
    0
    1. dragondort Messages postés 6 Statut Membre
       
      Salut,
      Effectivement, ça aurais pu jouer, mais ça ne fonctionne quand même pas.
      Toujours un problème pour que le fscanf passe a la ligne suivante de mon fichier.
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    c'est à cause de dernier champ qui contient d'espaces, donc fscanf lit que la 1ère chaine de dernier champ
    menu.ini
    1;0;N;[N]ouveauFichier;
    1;1;O;[O]uvrir;
    1;2;Q;[Q]uitter;
    2;0;C;Fichier[C];
    2;1;T;Fichier[T]exte;
    


    le code

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLONGUEURLIGNEMENU 50
    
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLONGUEURLIGNEMENU 50
    
    int AfficherMenu (void)
    {
      FILE *fichier = NULL;
      int i;
    
      int a1;
      int a2;
      char hotkey;
      char nomdeligne[MAXLONGUEURLIGNEMENU];
    
      fichier = fopen ("menu.ini", "r+");
    
      if (fichier == NULL){
        printf ("Impossible d'ouvrir le fichier test.txt");
        return -1;
      }
    
      printf ("Ouverture réussie !!! ^^ \n\n");
    
      while( fscanf (fichier, "%d;%d;%c;%s", &a1, &a2, &hotkey, nomdeligne) == 4)
        printf("Nombre 1 : %d\nNombre 2 : %d\nHotkey : %c\nNom de la ligne : %s\n\n",
                            a1, a2, hotkey, nomdeligne);
        fclose (fichier);
      return 0;
    }
    
    int main ()
    {
      AfficherMenu ();
      return 0;
    }
    
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Sinon, sur ton fichier d'origine avec espaces
    1;0;N;[N]ouveau Fichier;
    1;1;O;[O]uvrir;
    1;2;Q;[Q]uitter;
    2;0;C;Fichier [C];
    2;1;T;Fichier [T]exte;
    

    tu peux faire

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLONGUEURLIGNEMENU 50
    
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLONGUEURLIGNEMENU 50
    
    int AfficherMenu (void)
    {
      FILE *fichier = NULL;
      int i;
    
      int a1;
      int a2;
      char hotkey;
      char nomdeligne[MAXLONGUEURLIGNEMENU];
    
      fichier = fopen ("menu.ini", "r+");
    
      if (fichier == NULL){
        printf ("Impossible d'ouvrir le fichier test.txt");
        return -1;
      }
    
      printf ("Ouverture réussie !!! ^^ \n\n");
    
      while( fscanf (fichier, "%d;%d;%c;", &a1, &a2, &hotkey)==3 && fgets(nomdeligne,50,fichier)!=NULL)
        printf("Nombre 1 : %d\nNombre 2 : %d\nHotkey : %c\nNom de la ligne : %s\n\n",
                            a1, a2, hotkey, nomdeligne);
        fclose (fichier);
      return 0;
    }
    
    int main ()
    {
      AfficherMenu ();
      return 0;
    }
    
    0
    1. dragondort Messages postés 6 Statut Membre
       
      c'est a ca que je suis arrivé, et avec le fgets, il passe a la ligne automatiquement.

      Merci Beaucoup pour cette aide.
      0
  4. dragondort Messages postés 6 Statut Membre
     
    Merci a tous.

    Mon problème est résolu, mais pas totalement.
    Je peut continuer mon programme, mais je ne sais toujours pas comment faire pour faire passer a la ligne suivante dans un fichier texte, sans utiliser fgets.

    Donc, si quelqu'un connais la réponse, il peut toujours la poster.

    Encore Merci
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Tant qu'il y a des espaces, tu ne pourras pas avec fscanf.
      En revanche si tu remplace l'espace avec _ ça va marcher
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dragondort Messages postés 6 Statut Membre
     
    Merci, on m'a expliquer.

    Il faut extraire le texte avec fgets,
    puis utiliser fscanf sur le buffer.

    Maintenant c'est résolut completement.
    0