Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1719 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Newbie] utilisation de fscanf et retour fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Newbie] utilisation de fscanf et retour fonction

n°1879588
sneakz
Posté le 30-04-2009 à 09:25:41  profilanswer
 

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
mood
Publicité
Posté le 30-04-2009 à 09:25:41  profilanswer
 

n°1879600
olivthill
Posté le 30-04-2009 à 10:13:52  profilanswer
 

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.

n°1879607
sneakz
Posté le 30-04-2009 à 10:28:45  profilanswer
 

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]’

n°1879608
sneakz
Posté le 30-04-2009 à 10:34:11  profilanswer
 

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

n°1879615
olivthill
Posté le 30-04-2009 à 10:49:27  profilanswer
 

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.

n°1879618
sneakz
Posté le 30-04-2009 à 10:53:58  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Newbie] utilisation de fscanf et retour fonction

 

Sujets relatifs
Fonction recherchev alternativeUtilisation de la structure "case...of' en Pascal
La fonction mail() ne marche plus chez Free.fr ?Utilisation de XML comme base de donnnée
formatter le retour de ob_get_contents...Net::ftp code retour
fonction setlocale[PHP] Erreur sur une fonction foreach
[Lazarus] Utilisation de TChart?AS3 : Utilisation de variable et function d'une classe à l'autre (Eten
Plus de sujets relatifs à : [Newbie] utilisation de fscanf et retour fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR