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

  • Votes
  • Date
  • Date décroissante
  1. Merci, on m'a expliquer.

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

    Maintenant c'est résolut completement.
    1. 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
    2. 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.
    3. 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. 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.