Fscanf, pas de stockage de résultat

Fscanf, pas de stockage de résultat - C - Programmation

Marsh Posté le 04-06-2011 à 01:21:49    

Bonjour à tous !
 
Depuis quelque temps, je débute en C, et j'ai commencé à travailler sur les fichiers, les chaines et tout.
 
Mon but est de faire un programme de recherche dans un texte, et je bloque sur la fonction fscanf.
 
En effet je l'utilise comme ceci, ce n'est pas le programme original, mais je l'utilise de cette façon.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <iostream>
  5. #include <fstream>
  6. int main()
  7. {
  8. FILE* texte = NULL;
  9. char chaine[] = "50 30 22 Jean";   //chaine quon mettra dans le fichier
  10. char prenom[50];                   //chaine pour stocker le prenom
  11. int chiffres[3] = {0,0,0};         //tableau pour stocker les chiffres
  12. texte = fopen("texte.txt","w+" );   //ouverture/creation lect/ecrit
  13. fputs(chaine,texte);               //chaine qui va dans le fichier texte.txt
  14. printf("Dans le texte on a : %s",chaine);      //affichage de la chaine
  15. printf("\n\nVariables avant fscanf : %d, %d et %d\n\n",chiffres[0],chiffres[1],chiffres[2]);//Affichage des variables avant le fscanf
  16. printf("FSCANF" );
  17. fscanf(texte,"%d %d %d %s",&chiffres[0],&chiffres[1],&chiffres[2],prenom); //on effectue le fscanf
  18. printf("\n\nLes chiffres sont %d, %d et %d\nLe prenom est %s\n",chiffres[0],chiffres[1],chiffres[2],prenom); //on affiche les resultats
  19. fclose(texte);
  20. return 0;
  21. }


 
Et donc à l'exécution, voici ce que j'obtiens :
https://lh5.googleusercontent.com/-xRj8muIiPv4/TelrkHeLwVI/AAAAAAAAAjU/rQ4MOjdV1GM/fscanf.png
 
Les variables n'ont pas changé. J'ai trouvé pas mal de tuto (siteduzero notamment), j'ai fouillé sur l'utilisation de la fonction fscanf, et je ne vois pas bien ce que j'ai raté.
 
Ca fait quelque temps que je me penche sur le problème, et j'aimerais bien un peu d'aide  :D  
 
 
Merci pour la lecture, et vos futures réponses.
 
Boris.


Message édité par gilou le 04-06-2011 à 14:37:08

---------------
Iriver h320, toujours au top en fait...
Reply

Marsh Posté le 04-06-2011 à 01:21:49   

Reply

Marsh Posté le 04-06-2011 à 04:50:22    

Ok tout le monde, j'ai trouvé une réponse à mon problème.
 
Je viens de voir qu'avec une ouverture en lecture seule, donc avec le paramètre "r" ça marche.
 
Est ce que quelqu'un pourrait m'expliquer pourquoi du coup ? Probleme de droits du fichier ?
 
Dans le programme que j'ai fait donc, ça se passe comme ça :
ouverture du fichier en écriture
on met la chaine dans le fichier
on ferme le fichier
on l'ouvre en lecture seule
fscanf, et là ça marche !
 
Pas grave si je n'ai pas de réponse sur les droits, peut etre que si quelqu'un a un souci similaire, il aura une réponse.
 


---------------
Iriver h320, toujours au top en fait...
Reply

Marsh Posté le 04-06-2011 à 14:34:56    

Ce qui va pas dans le code posté (aux questions de droit près):
 
Quand tu fais fputs(chaine,texte); ta position dans le fichier est a la fin de la chaîne écrite. Quand tu fais ensuite fscanf(texte,"%d %d %d %s",&chiffres[0],&chiffres[1],&chiffres[2],prenom); tu fais une lecture après ce que tu viens d'écrire.
Il faut donc avant d'écrire stocker la position dans le fichier, écrire, revenir à la position stockée, et enfin lire ce qu'on vient d'écrire.    
long pos = ftell(texte);  // stockage de la position dans le fichier
fputs(chaine,texte);
....    
fseek(texte, pos, SEEK_SET); // retour à la position stockée
fscanf(texte,"%d %d %d %s",&chiffres[0],&chiffres[1],&chiffres[2],prenom);
 
Notes que quand c'est la première ligne du fichier, on peut simplifier ceci (mais la procédure précédente est la plus générale et la plus utile):
fputs(chaine,texte); // écriture de la première ligne du fichier
....    
rewind(texte); // retour en début de fichier
fscanf(texte,"%d %d %d %s",&chiffres[0],&chiffres[1],&chiffres[2],prenom);
 

Citation :

Dans le programme que j'ai fait donc, ça se passe comme ça :  
ouverture du fichier en écriture  
on met la chaine dans le fichier  
on ferme le fichier  
on l'ouvre en lecture seule  
fscanf, et là ça marche !

 
Ça marche parce que tu écris la première ligne, et que quand tu fermes et qu'ensuite tu rouvres le fichier, tu es positionné en début de fichier.
 
A+,


Message édité par gilou le 04-06-2011 à 14:36:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-06-2011 à 17:25:08    

Ok !
 
Effectivement je n'avais pas pensé à ma position dans le fichier que je lisais.
 
L'utilisation du rewind c'est vrai, est plus simple dans mon cas par exemple. Dans des cas plus complexes, j'utiliserais le stockage de position.
 
Je pensais qu'il y avait des soucis de droit d'accès aux fichiers, qui parfois me dépasse :)
 
En tout cas merci pour ta réponse très claire !


---------------
Iriver h320, toujours au top en fait...
Reply

Sujets relatifs:

Leave a Replay

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