lecture de fichier avec sscanf

lecture de fichier avec sscanf - C - Programmation

Marsh Posté le 27-02-2006 à 16:13:48    

Bonjour,
 
Je voudrais lire les données d'un fichier comportant plusieurs lignes.
Par exemple, la première ligne comporte les données ASCII suivantes:  
FREQUENCY POWER (etc...)
mon code est le suivant:
 
/* je parcours le fichier avec l instruction suivante:*/
while(fgets(ligne,LONG,File) != NULL) {    
/* je veux lire par exemple les deux premiers mots FREQUENCY et POWER de la premiere ligne de mon fichier. Pour cela, je fais: */
sscanf(ligne,"%9s %5s", &Freq, &Puiss);
printf("Freq vaut: %s     et Puiss vaut: %s\n",&Freq,&Puiss);
/* Freq est initialisé à: char *Freq='fffffffff'; par exemple et Puiss à: char *Puiss='ppppp'; */
 
Le résultat de mon printf apres execution me donne:      Freq vaut: FREQPOWER et Puiss vaut: POWER!!
Je n'obtiens pas de que je veux et ne trouve pas d'où pourrait provenir mon erreur...
 
Auriez-vous une idée?
Merci d'avance!
 
Sandra

Reply

Marsh Posté le 27-02-2006 à 16:13:48   

Reply

Marsh Posté le 27-02-2006 à 16:25:47    

sandra771 a écrit :

Je voudrais lire les données d'un fichier comportant plusieurs lignes.


Ce code est très incomplet (mais ces '&' sont très suspects !). Merci de poster un code complet et compilable réduit au minimum montrant le problème, avec un exemple de fichier de données.
 
On ne sait pas ce que tu ne sais pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2006 à 16:57:34    

En fait, le programme est assez conséquent!  
J'ai essayé de garder l'essentiel, j'espère que ça suffira!
 
# include <stdio.h>
# define LONG 30
void main() {
 
static FILE *File = NULL;
/* soit un fichier comportant une seule ligne de code ASCII pour simplifier, soit la ligne suivante:
FREQUENCY POWER */
 
typedef struct {
UCHAR Freq;
UCHAR Puiss;
} MaStruct;
 
char ligne[LONG];
 
/* apres ouverture du fichier: */
 
while(fgets(ligne,LONG,File) != NULL) {  
 
sscanf(ligne,"%9s %5s", &MaStruct.Freq, &MaStruct.Puiss);
printf("Freq vaut: %s et Puiss vaut: %s\n", &MaStruct.Freq, &MaStruct.Puiss);
 
}
}
 
Sandra

Reply

Marsh Posté le 27-02-2006 à 17:28:06    

sandra771 a écrit :

J'ai essayé de garder l'essentiel, j'espère que ça suffira!


Tu as compilé ? Parce qu'il manque encore la moitié du code là. Et le fichier, il est ouvert comment ?
Ceci devrait fonctionner (pas pu le tester, le fichier ne s'ouvre pas pour une raison que j'ignore)

Code :
  1. # include <stdio.h>
  2. # define LONG 30
  3. #define fname "data.txt"
  4. /* -ed- http://mapage.noos.fr/emdel/notes.htm#typemain */
  5. int main(void)
  6. {
  7.    /* -ed-
  8.       static FILE *File = NULL;
  9.    pourquoi static ?
  10.    */
  11.    FILE *File = fopen ("r", fname);
  12.    if (File != NULL)
  13.    {
  14.       /* soit un fichier comportant une seule ligne de code ASCII pour
  15.       simplifier, soit la ligne suivante:
  16.       FREQUENCY POWER */
  17.       typedef struct
  18.       {
  19.          char Freq[LONG];
  20.          char Puiss[LONG];
  21.       }
  22.       MaStruct;
  23.       /* -ed- manquant */
  24.       MaStruct data;
  25.       char ligne[LONG];
  26.       /* apres ouverture du fichier: */
  27.       while (fgets(ligne, LONG, File) != NULL)
  28.       {
  29.          int n = sscanf(ligne, "%s %s", data.Freq, data.Puiss);
  30.          if (n == 2)
  31.          {
  32.          printf("Freq vaut: %s et Puiss vaut: %s\n", data.Freq, data.Puiss);
  33.          }
  34.          else
  35.          {
  36.             printf ("input error : '%s'", ligne);
  37.          }
  38.       }
  39.       fclose (File);
  40.    }
  41.    else
  42.    {
  43.       perror (fname);
  44.    }
  45.    return 0;
  46. }


Message édité par Emmanuel Delahaye le 27-02-2006 à 17:38:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2006 à 09:36:07    

Ca y est, ça marche!
Merci beaucoup. Tu m'as vraiment débloqué. En fait, ce sont bien les & qui étaient en trop... ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed