Probleme avec fscanf .

Résolu
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. essaye en rajoutant le ";" de fin de ligne
    fscanf(fichier, "%d;%d;%c;%s;", &a1, &a2, &hotkey, nomdeligne);
    1. 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.
  2. Modérateur
    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;
    }
    
    1. Modérateur
      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;
      }
      
      1. c'est a ca que je suis arrivé, et avec le fgets, il passe a la ligne automatiquement.

        Merci Beaucoup pour cette aide.
    2. 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
      1. Modérateur
        Tant qu'il y a des espaces, tu ne pourras pas avec fscanf.
        En revanche si tu remplace l'espace avec _ ça va marcher
    3. Merci, on m'a expliquer.

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

      Maintenant c'est résolut completement.