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

  FORUM HardWare.fr
  Programmation
  C

  Problème de lecture d'un fichier avec fread

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de lecture d'un fichier avec fread

n°2118819
madruuu
Posté le 30-12-2011 à 23:15:19  profilanswer
 

Bonsoir à tous,
 
j'ai 2 énormes problèmes dans mon code.
 
Le 1er : je veux lire le contenu (entier) d'un fichier.
Je teste si l'ouverture de mon fichier a fonctionné : c'est le cas.
Je vérifie(manuellement) dans mes dossiers si mon fichier est bien rempli : c'est le cas.
Cependant quand je fais mon "fread" il me renvoit NULL.
Je ne comprends pas pourquoi =/ avez-vous une solution ?
 
 
 
Mon autre problème, je dois créer des historiques de conversation, et mon utilisateur doit pouvoir afficher sa conversation en cours s'il le souhaite.
Le problème c'est que l'écriture n'est effective qu'une fois que j'ai coupé mon programme.
COmment puis-je faire pour que mon utilisateur puisse lire ce fichier de conversation en laissant mon programme tourner ? =/
 
Merci d'avance pour vos réponses !

mood
Publicité
Posté le 30-12-2011 à 23:15:19  profilanswer
 

n°2118839
Terminapor
I'll see you rise.
Posté le 31-12-2011 à 09:53:37  profilanswer
 

Avec quelque ligne de code ça serait moins hasardeux :o :D


---------------
Perhaps you don't deserve to breathe
n°2118912
madruuu
Posté le 01-01-2012 à 11:11:15  profilanswer
 

Code :
  1. void afficher_historique(HISTORIQUE TabHistory[], int BorneSupCourante)
  2. {
  3. FILE *F;
  4. FILE *FicUser;
  5. int i = 0;
  6. HISTORIQUE HistoriqueCurr[500];
  7. char datefic[50];
  8. char chaine[1000];
  9. char nomusercurr[100];
  10. strcpy(nomusercurr,TabHistory[BorneSupCourante-1].user.nom);
  11. printf("Entrez la date dont vous voulez l'historique(dd/mm/aaaa)" );
  12. scanf("%s",datefic);
  13. F = fopen("History.txt","r" );
  14. if(F!=NULL)
  15. {
  16.  printf("F EST PAS NULL \n" );
  17.  if((fread(&HistoriqueCurr[i],sizeof(HISTORIQUE),1,F)) == 0) printf("FREAD EST NUL" );
  18.  while((fread(&HistoriqueCurr[i],sizeof(HISTORIQUE),1,F)) != 0)
  19.  {
  20.                             // traitement
  21.   }
  22. }
  23. }


et là le fread me renvoit null =/ (désolée pour la mauvaise indentation mais quand j'édite les accolades et les tabulations que j'ai entrées ne sont pas respectées >< )


Message édité par madruuu le 01-01-2012 à 11:15:28
n°2118925
gilou
Modérateur
Modzilla
Posté le 01-01-2012 à 13:42:42  profilanswer
 

Ce code a l'air bon à priori (mais ais-je les yeux en face des trous après le réveillon?).
 
Vérifies la taille de ton fichier telle que vue par ton code ainsi que la taille de ta structure à tout hasard:
fseek(F, 0L, SEEK_END);
fsize = ftell(F);
ssize = sizeof(HISTORIQUE);
printf("file size: %d, HISTO size:%d\n", fsize, ssize);
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2118931
madruuu
Posté le 01-01-2012 à 14:33:59  profilanswer
 

J'ai testé les tailles,  le fichier a une taille de 124 et ma structure de 300 =/ je ne vois vraiment pas pourquoi fread ne veut pas lire ce fichier

n°2118940
Un Program​meur
Posté le 01-01-2012 à 18:12:06  profilanswer
 

madruuu a écrit :

J'ai testé les tailles,  le fichier a une taille de 124 et ma structure de 300 =/ je ne vois vraiment pas pourquoi fread ne veut pas lire ce fichier


 
Donc il manque 176 bytes à ton fichier pour remplir ta structure, c'est pas étonnant que fread échoue.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2118941
madruuu
Posté le 01-01-2012 à 18:40:22  profilanswer
 

le fichier doit avoir forcément une taille égale à celle de la structure ? Je veux bien que le fait que le fichier soit trop volumineux pour la structure soit problématique mais là c'est étonnant. Y a-t-il un moyen de contourner ça ? =/ ou est-ce une erreur de ma part ?

n°2118943
Un Program​meur
Posté le 01-01-2012 à 18:43:38  profilanswer
 

Tu demandes de lire 300 bytes, un fichier qui fait plus ne pose pas de problèmes, un fichier qui fait moins, en pose bien un.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2118945
gilou
Modérateur
Modzilla
Posté le 01-01-2012 à 18:44:40  profilanswer
 

Tu demandes de lire 300 octets dans un fichier qui n'en contient que 124, c'est clair que ça va échouer.
Bref, je ne sais pas comment ton fichier a été créé, mais il ne correspond pas à l'enregistrement d'une structure HISTORIQUE
A+,


Message édité par gilou le 01-01-2012 à 18:46:32

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2118951
madruuu
Posté le 01-01-2012 à 18:53:20  profilanswer
 

D'accord. Le problème c'est que les variables que j'ajoute dans mon fichier sont déclarées à la même taille que celles de ma structure =/

mood
Publicité
Posté le 01-01-2012 à 18:53:20  profilanswer
 

n°2118956
Terminapor
I'll see you rise.
Posté le 01-01-2012 à 19:23:26  profilanswer
 

Comment tu écris dans ton fichier ? Tu peux montrer le code ?


---------------
Perhaps you don't deserve to breathe
n°2118963
madruuu
Posté le 01-01-2012 à 19:40:52  profilanswer
 

Code :
  1. char dateconv[50];
  2. sprintf(jour,"%d",t->tm_mday); // convertir le jour en chaine de caractères
  3. sprintf(mois,"%d",mois_conv); // convertir le mois en chaine
  4. sprintf(anneestr,"%d",annee); // convertir l'année en chaine
  5. strcpy(TabHistory[indice].user.nom,nom);
  6. strcpy(TabHistory[indice].nom_fichier,namefic);
  7. sprintf (dateconv, "%s%c%s%c%s", jour, slash, mois, slash, anneestr);
  8. strcpy(TabHistory[indice].date_conv,dateconv);
  9. fprintf(ficHistory,"%s ",dateconv);
  10. fprintf(ficHistory,"%s ",nom);
  11. fprintf(ficHistory,"%s ",namefic);


 
le namefic est passé en parametre, il a la même taille que le champ correspondant dans la structure historique, je vous ai passé les détails des déclarations des autres éléments sans importance.


Message édité par madruuu le 01-01-2012 à 19:41:38
n°2118976
madruuu
Posté le 01-01-2012 à 22:44:11  profilanswer
 

Même en remplaçant le "sizeof(HISTORIQUE)" par la taille de mon fichier mon fread me renvoit null....je ne vois plus comment faire là =/

n°2118978
breizhbugs
Posté le 01-01-2012 à 23:09:58  profilanswer
 

C'est un peu normal...
Ou es ta logique: tu enregistres les données en mode texte, et tu veux les charger en mode binaire dans une structure...
Pourquoi n'enregistres tu pas ta structure via fwrite() au lieu de la décomposée en ses différents champs en mode texte qui plus est....


---------------
Seul Google le sait...
n°2119028
madruuu
Posté le 02-01-2012 à 14:07:22  profilanswer
 

Mes fichiers d'historiques doivent impérativement être des fichiers textes.
Voila pourquoi j'ai fait ça ;)
 
ensuite c'est vrai erreur débile de ma part, je pensais que le fread fonctionnait toujours, j'ai donc remplacer ça par l'utilisation de  fscanf, le problème est qu'il ne me remplit pas ma structure...

n°2119050
gilou
Modérateur
Modzilla
Posté le 02-01-2012 à 16:55:27  profilanswer
 

Et si tu nous donnait le code définissant ta structure HISTORIQUE...
Qu'on ait une idée des champs qui la composent.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2119054
madruuu
Posté le 02-01-2012 à 17:01:40  profilanswer
 

Voici la définition de ma structure :  
 

Code :
  1. typedef struct
  2. {
  3. char date_conv[50];
  4. char nom_fichier[200];
  5. USER user;
  6. } HISTORIQUE;


 
elle utilise cette deuxième structure :  
 

Code :
  1. typedef struct
  2. {
  3. char nom[50];
  4. }USER;


Message édité par madruuu le 02-01-2012 à 17:04:11
n°2119059
gilou
Modérateur
Modzilla
Posté le 02-01-2012 à 17:31:19  profilanswer
 

OK.  
Comme tu as écrit ta structure dans ton fichier avec trois fprintf, tu vas devoir lire ta structure avec trois fscanf, ou avec un scanf triple:
fscanf(F, "%s%s%s", HistoriqueCurr[i].date_conv, HistoriqueCurr[i].user.nom, HistoriqueCurr[i].nom_fichier);  
Pour lire ta structure avec un fread, il aurait fallu que tu l'écrives avec un fwrite.
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2119065
madruuu
Posté le 02-01-2012 à 17:42:27  profilanswer
 

c'est déja ce que je fais avec le fscanf, je l'ai écrit exactement comme tu viens de me l'écrire(avec les %s%s%s), et pourtant quand j'affiche le nom de mon user il est vide.=/

n°2119066
gilou
Modérateur
Modzilla
Posté le 02-01-2012 à 17:43:27  profilanswer
 

Faudra que tu fasses péter ton code, parce que la, c'est sur que tu as un pb dans ton code.
EDIT: vu tes fprintf, c'est en fait ceci que tu devrais avoir
fscanf(F, "%s %s %s ", HistoriqueCurr[i].date_conv, HistoriqueCurr[i].user.nom, HistoriqueCurr[i].nom_fichier);  
A+,


Message édité par gilou le 02-01-2012 à 17:45:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2119071
madruuu
Posté le 02-01-2012 à 17:54:20  profilanswer
 

péter mon code ?

n°2119072
gilou
Modérateur
Modzilla
Posté le 02-01-2012 à 17:59:17  profilanswer
 

Poster ici le code avec ledit fscanf qui marche pas
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2119075
madruuu
Posté le 02-01-2012 à 18:03:56  profilanswer
 

oui j'avais mis les espaces entre les %s mais ça ne fonctionne quand même pas. C'est vraiment étrange.

n°2119076
madruuu
Posté le 02-01-2012 à 18:05:42  profilanswer
 

c'est le même code que précédemment sauf qu'à la place du fread j'ai mis ceci :
 

Code :
  1. if(F!=NULL)
  2. {
  3.  printf("F EST PAS NULL \n" );
  4.  while(i != 2)
  5.  {
  6.   fscanf(F,"%s %s %s",HistoriqueCurr[i].date_conv,HistoriqueCurr[i].user.nom,HistoriqueCurr[i].nom_fichier);


Message édité par madruuu le 02-01-2012 à 18:06:12
n°2119088
gilou
Modérateur
Modzilla
Posté le 02-01-2012 à 20:53:54  profilanswer
 

Chez moi ça marche, hein...
Bon, j'ai été dérangé au milieu de ce post, et n'ai pas pu te répondre plus tôt.
 
J'ai écrit un programme vite fait pour écrire un fichier d'historique:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct {
  5.     char nom[50];
  6. } USER;
  7. typedef struct {
  8.     char date_conv[50];
  9.     char nom_fichier[200];
  10.     USER user;
  11. } HISTORIQUE;
  12. HISTORIQUE HistoriqueCurr[2];
  13. void HistoInit() {
  14.     strcpy(HistoriqueCurr[0].date_conv,"31/12/2011" );
  15.     strcpy(HistoriqueCurr[1].date_conv, "1/1/2012" );
  16.     strcpy(HistoriqueCurr[0].user.nom, "Toto" );
  17.     strcpy(HistoriqueCurr[1].user.nom, "Tutu" );
  18.     strcpy(HistoriqueCurr[0].nom_fichier, "fic1" );
  19.     strcpy(HistoriqueCurr[1].nom_fichier, "fic2" );
  20.    
  21. }
  22. int main() {
  23.     FILE *F;
  24.     F = fopen("History.txt", "w" );
  25.     if (F) {
  26. int i;
  27. HistoInit();
  28. for (i = 0; i < 2; i++) {
  29.     fprintf(F,"%s ",HistoriqueCurr[i].date_conv);
  30.     fprintf(F,"%s ",HistoriqueCurr[i].user.nom);
  31.     fprintf(F,"%s ",HistoriqueCurr[i].nom_fichier);
  32. }
  33. fclose(F);
  34.     }
  35. }


Qui écrit donc le fichier (monoligne) History.txt suivant:

31/12/2011 Toto fic1 1/1/2012 Tutu fic2


Ensuite j'écris un programme test en lecture:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct {
  5.     char nom[50];
  6. } USER;
  7. typedef struct {
  8.     char date_conv[50];
  9.     char nom_fichier[200];
  10.     USER user;
  11. } HISTORIQUE;
  12. int main() {
  13.     FILE *F;
  14.     HISTORIQUE HistoriqueCurr[2];
  15.     int i;
  16.     F = fopen("History.txt", "r" );
  17.     if (F) {
  18. for (i = 0; i < 2; i++) {
  19.     fscanf(F,"%s %s %s ",HistoriqueCurr[i].date_conv, HistoriqueCurr[i].user.nom, HistoriqueCurr[i].nom_fichier);
  20. }
  21. fclose(F);
  22.     }
  23.     for (i = 0; i < 2; i++) {
  24. printf("Date:%s File: %s Name: %s\n", HistoriqueCurr[i].date_conv, HistoriqueCurr[i].nom_fichier, HistoriqueCurr[i].user.nom);
  25.     }
  26. }


 
Ce qui donne en sortie:

Date:31/12/2011 File: fic1 Name: Toto
Date:1/1/2012 File: fic2 Name: Tutu


 
Variante quand on connait pas le nombre exact de records inscrits:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct {
  5.     char nom[50];
  6. } USER;
  7. typedef struct {
  8.     char date_conv[50];
  9.     char nom_fichier[200];
  10.     USER user;
  11. } HISTORIQUE;
  12. #define HISTO_SIZE 2
  13. int main() {
  14.     FILE *F;
  15.     HISTORIQUE HistoriqueCurr[HISTO_SIZE];
  16.     int i, read;
  17.     F = fopen("History.txt", "r" );
  18.     if (F) {
  19. read = 0;
  20. int items;
  21. while (read < HISTO_SIZE) {
  22.     items = fscanf(F,"%s %s %s ", HistoriqueCurr[read].date_conv, HistoriqueCurr[read].user.nom, HistoriqueCurr[read].nom_fichier);
  23.     if (items != 3)
  24.  break;
  25.     ++read;
  26. }
  27. fclose(F);
  28.     }
  29.     for (i = 0; i < read ; i++) {
  30. printf("Date:%s File: %s Name: %s\n", HistoriqueCurr[i].date_conv, HistoriqueCurr[i].nom_fichier, HistoriqueCurr[i].user.nom);
  31.     }
  32. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2119275
madruuu
Posté le 03-01-2012 à 18:59:00  profilanswer
 

Bonsoir,  
je voulais vous dire que j'ai trouvé mon problème : cela venait en fait d'un ftell que j'avais laissé ! il me positionnait le curseur à la fin du fichier ce qui faussait tout le reste de mon code ! Merci pour votre aide, bonne soirée

mood
Publicité
Posté le   profilanswer
 


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

  Problème de lecture d'un fichier avec fread

 

Sujets relatifs
optimiser le temps de lecture d'un gros fichiertransformer un fichier excel en fichier txt
Problème de margin sur mon siteLire mon fichier csv a partir de la deuxième ligne
[résolu]Problème déploiement et routage heroku.Où se trouve le fichier de descripteur de déploiement ?
Probleme d'écriture sur un script[C][OSX][LibSDL] Compilation OK, mais problème d'exécution...
Plus de sujets relatifs à : Problème de lecture d'un fichier avec fread


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