[Newbie] utilisation de fscanf et retour fonction

utilisation de fscanf et retour fonction [Newbie] - C - Programmation

Marsh Posté le 30-04-2009 à 09:25:41    

Bonjour,
 
J'ai un fichier toto.txt avec 2 lignes.
Je souhaite récupérer chacune d'elle dans des variables. Le contenu de l'une d'entre-elle doit passer un test de comparaison avec un entier (int test passé en argument). Le fichier est traité dans l'appel d'une fonction (lecture_fichier). Si le test est validé, un retour doit être transmis au code principal.
 
Voici un premier jet :
 

Code :
  1. void lecture_fichier(int test)
  2. {
  3.    char *name = "toto.txt"; 
  4.    char valeur1[4];
  5.    char valeur2[BUFSIZ];
  6.    FILE *file;
  7.  
  8.    if ((file = fopen ( name, "r" )) == NULL)
  9.    perror ("Impossible d'ouvrir le fichier." );
  10.    else
  11.    {
  12.       while ( fscanf ( file, "%s %s", valeur1, valeur2 ) == 2)
  13.       printf("%s\n%s\n", valeur1, valeur2);
  14.    fclose ( file );
  15.    }
  16. }


 
[U]Mes questions sont les suivante[/U]s :
 
- je ne sais pas dans quelle mesure l'utilisation de la fonction fscanf est optimale et s'il n'existe pas une solution alternative plus propre ?
 
- lors de mon test, je vais avoir un problème de comparaison entre un pointeur et un entier et je ne sais pas comment pallier à ce problème.
 
- enfin, comment dois-je intégrer à ma fonction le retour du test qui sera récupérer par le code principal ?
 
Merci bien pour votre  aide.


Message édité par sneakz le 30-04-2009 à 09:26:59
Reply

Marsh Posté le 30-04-2009 à 09:25:41   

Reply

Marsh Posté le 30-04-2009 à 10:13:52    

Il faut un "&" devant les noms des variables passées en paramètres à fscanf() : fscanf ( file, "%s %s", &valeur1, &valeur2 )
 
C'est très important, car cela indique que l'on passe l'adresse de la variable et non pas son contenu. Plus précisément, l'adresse de la variable est déposée sur la pile, alors que inon c'est son contenu qui est déposé sur la pile.
 
La fonction fscanf() (et aussi printf()) peut prendre plusieurs paramètres et donc il n'y a pas de controle de la nature des arguments sauf avec des compilateurs évolués.

Reply

Marsh Posté le 30-04-2009 à 10:28:45    

Merci olivthill pour ces compléments d'infos mais si je place l'adresse de la variable, j'ai ces  messages sur la ligne concernée.
 
attention : format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[4]’
attention : format ‘%s’ expects type ‘char *’, but argument 4 has type ‘char (*)[8192]’

Reply

Marsh Posté le 30-04-2009 à 10:34:11    

Cela fonctionne si je considère mes variables comme des entiers, dixit :
 
int valeur1;
int valeur2;

Reply

Marsh Posté le 30-04-2009 à 10:49:27    

Désolé, je ne suis pas réveillé ce matin. Je me suis trompé, parce que je n'avais pas vu que c'était des chaines de caractères et parce que j'avais lu les mots "retour fonction" dans le titre qui m'avaient fait penser que le problème aurait été que les données n'auraient pas été retournées, ce qui se serait produit si on avait donné le contenu au lieu du pointeur. Donc, quelle est la question ?  
 
Est-ce optimale ? La réponse est que cela dépend de ce que l'on veut et de son environnement. Au lieu du fscanf, on pourrait avoir un fread, et on pourrait alors s'assurer que chaque caractère est correct et mieux gérer les erreurs éventuelles. Mais ce serait plus compliqué à programmer.  
 
Comment comparer un pointeur et un entier ?
Si c'est un pointeur sur un entier, alors on utilise l'étoile "*" pour dire que l'on veut le contenu de la donnée, par exemple :

int *p;
int i;
*p = 2
i = 3
if (i > *p)
...


Si c'est un pointeur sur une chaine, alors il faut convertir la chaine en un entier en prenant chaque caractère de la chaine, en le convertissant ce caractère en un chiffre, en ajoutant ce chiffre au résultat précédent multiplié par dix. Ensuite on compare l'entier et le nombre qui provient de la conversion de la chaine de caractère.

Reply

Marsh Posté le 30-04-2009 à 10:53:58    

Merci bien olivthill d'avoir pris le temps de répondre et d'avoir apporter des précisions très claires.
Je comprends mieux désormais.

Reply

Sujets relatifs:

Leave a Replay

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