Fonction fread lit bizarrement un fichier texte

cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009 - 2 avril 2009 à 14:17
cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009 - 2 avril 2009 à 17:15
Bonjour à tous, voici mon problème : j'écris dans le fichier vect3.txt 3 floats grâce à la fonction fwrite, cela se passe bien cependant, lorsque je veux lire ces floats avec fread, seul le premier est lu (j'ai bien mis le fichier et le .exe dans le même dossier). Merci davance! Voici le code :

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float f1,f2,f3;
    FILE *file;
    file=fopen("vect3.txt","w+r");
   
   /*Ecriture*/
   
    fwrite ("12",2,1,file);
    fwrite (" ",1,1,file);
    fwrite ("51",2,1,file);
    fwrite (" ",1,1,file);
    fwrite ("76",2,1,file);
   
   /*Lecture*/
   
    fscanf(file,"%f %f %f\n",&f1,&f2,&f3);
    fclose(file);
    printf("%f et %f et %f\n",f1,f2,f3);
   
    return0;     
    system("pause");}

6 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
2 avril 2009 à 14:34
Salut,

fwrite fait avancer le pointeur dans le fichier. Bilan avec ton fscanf tu lis la fin du fichier.

Utilise fseek.
<hr size="2" width="100%" />
#include <stdio.h>
#include <stdlib.h>

int main()
{
    float f1,f2,f3;
    FILE *file;
    file=fopen("vect3.txt","w+r");
  
   /*Ecriture*/
    fwrite ("12",2,1,file);
    fwrite (" ",1,1,file);
    fwrite ("51",2,1,file);
    fwrite (" ",1,1,file);
    fwrite ("76",2,1,file);
   /*Lecture*/
   
    fseek(file, SEEK_SET, 0);
    fscanf(file,"%f %f %f\n",&f1,&f2,&f3);
    fclose(file);
    printf("%f et %f et %f\n",f1,f2,f3);
  
    return 0;    
}
0
cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
2 avril 2009 à 15:51
Grand merci à toi rt15, ta solution est parfaitement fonctionnelle.
0
cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
2 avril 2009 à 16:35
rt51, j'ai réessayé avec mon code original et je pense qu'en plus de problème de lecture qui est réglé il y a un problème d'écriture même si les entoers que j'envoie dans mon fichier texte y apparaissent bien, pour qu'ils soient visibles en lecture, je dois obligatoirement ouvrir le fichier texte et cliquer sur enregistrer même si je n'y modifie rien, et là ils apparîssent en lecture! j'avoue être un peu perdu..Voici mon code réel d'écriture :

 char co1[4];
     char co2[4];
     char co3[4];
   
     sprintf(co1,"%d",vecteur3[0]);
     sprintf(co2,"%d",vecteur3[1]);
     sprintf(co3,"%d",vecteur3[2]);
   
     /*écriture dans le fichier texte des coordonnées du vecteur image*/
     FILE *fp;
     fp=fopen("vect3.txt","w+r");
     fwrite (co1,sizeof(co1),1,fp);
     fwrite (" ",1,1,fp);
     fwrite (co2,sizeof(co2),1,fp);
     fwrite (" ",1,1,fp);
     fwrite ("2",sizeof(co3),1,fp);

Merci beaucoup.
0
cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
2 avril 2009 à 16:36
je corrige le dernier fwrite n'est pas  <strike>fwrite ("2",sizeof(co3),1,fp);
</strike>c'est fwrite (co3,sizeof(co3),1,fp);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
2 avril 2009 à 16:57
Tu écris sizeof(co1) = 4 octets.
Pourtant, tu fais un sprintf(co1,"%d",vecteur3[0]);

Donc si vecteur3[0] = 2, tu as "2\0XX" dans co1. C'est à dire 2, le zéro terminal, et deux caractères aléatoires.
Si tu écris ça dans le fichier, ça va effectivement faire un peu n'importe quoi.

Soit tu utilises strlen, soit tu termine co1 avec des espaces.


<hr />
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{
    float f1,f2,f3;
    char co1[4];
    char co2[4];
    char co3[4];
    int vecteur3[3];
    FILE *fp;

    vecteur3[0] = 1;
    vecteur3[1] = 2;
    vecteur3[2] = 3;
   
    sprintf(co1,"%d",vecteur3[0]);
    sprintf(co2,"%d",vecteur3[1]);
    sprintf(co3,"%d",vecteur3[2]);
   
    fp=fopen("vect3.txt","w+r");
    fwrite (co1,strlen(co1),1,fp);
    fwrite (" ",1,1,fp);
    fwrite (co2,strlen(co2),1,fp);
    fwrite (" ",1,1,fp);
    fwrite (co3,strlen(co3),1,fp);
  
    fseek(fp, SEEK_SET, 0);
    fscanf(fp,"%f %f %f\n",&f1,&f2,&f3);
    fclose(fp);
    printf("%f et %f et %f\n",f1,f2,f3);
  
    return 0;    
}

<hr />#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void padd(char* lpStr, int nLen)
{
  int i;

  for (i = 0; i < nLen; i++)
    if (! lpStr[i]) break;

  for (;i < nLen; i++)
    lpStr[i] = ' ';
}

int main()
{
    float f1,f2,f3;
    char co1[4];
    char co2[4];
    char co3[4];
    int vecteur3[3];
    FILE *fp;

    vecteur3[0] = 1;
    vecteur3[1] = 2;
    vecteur3[2] = 3;
   
    sprintf(co1,"%d",vecteur3[0]);
    sprintf(co2,"%d",vecteur3[1]);
    sprintf(co3,"%d",vecteur3[2]);

    padd(co1, 4);
    padd(co2, 4);
    padd(co3, 4);

    fp=fopen("vect3.txt","w+r");
    fwrite (co1,sizeof(co1),1,fp);
    fwrite (" ",1,1,fp);
    fwrite (co2,sizeof(co2),1,fp);
    fwrite (" ",1,1,fp);
    fwrite (co3,sizeof(co3),1,fp);
  
    fseek(fp, SEEK_SET, 0);
    fscanf(fp,"%f %f %f\n",&f1,&f2,&f3);
    fclose(fp);
    printf("%f et %f et %f\n",f1,f2,f3);
  
    return 0;    
}

 
0
cs_bilel59 Messages postés 14 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 avril 2009
2 avril 2009 à 17:15
Encore une fois un grand merci à toi cela fonctionne parfaitement , merci des explications.
0
Rejoignez-nous