Problème de lecture d'un fichier avec fread

Problème de lecture d'un fichier avec fread - C - Programmation

Marsh Posté le 30-12-2011 à 23:15:19    

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 !

Reply

Marsh Posté le 30-12-2011 à 23:15:19   

Reply

Marsh Posté le 31-12-2011 à 09:53:37    

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


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 01-01-2012 à 11:11:15    

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
Reply

Marsh Posté le 01-01-2012 à 13:42:42    

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é!  --
Reply

Marsh Posté le 01-01-2012 à 14:33:59    

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

Reply

Marsh Posté le 01-01-2012 à 18:12:06    

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)
Reply

Marsh Posté le 01-01-2012 à 18:40:22    

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 ?

Reply

Marsh Posté le 01-01-2012 à 18:43:38    

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)
Reply

Marsh Posté le 01-01-2012 à 18:44:40    

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é!  --
Reply

Marsh Posté le 01-01-2012 à 18:53:20    

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 =/

Reply

Marsh Posté le 01-01-2012 à 18:53:20   

Reply

Marsh Posté le 01-01-2012 à 19:23:26    

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


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 01-01-2012 à 19:40:52    

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
Reply

Marsh Posté le 01-01-2012 à 22:44:11    

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à =/

Reply

Marsh Posté le 01-01-2012 à 23:09:58    

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...
Reply

Marsh Posté le 02-01-2012 à 14:07:22    

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...

Reply

Marsh Posté le 02-01-2012 à 16:55:27    

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é!  --
Reply

Marsh Posté le 02-01-2012 à 17:01:40    

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
Reply

Marsh Posté le 02-01-2012 à 17:31:19    

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é!  --
Reply

Marsh Posté le 02-01-2012 à 17:42:27    

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.=/

Reply

Marsh Posté le 02-01-2012 à 17:43:27    

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é!  --
Reply

Marsh Posté le 02-01-2012 à 17:54:20    

péter mon code ?

Reply

Marsh Posté le 02-01-2012 à 17:59:17    

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é!  --
Reply

Marsh Posté le 02-01-2012 à 18:03:56    

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

Reply

Marsh Posté le 02-01-2012 à 18:05:42    

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
Reply

Marsh Posté le 02-01-2012 à 20:53:54    

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é!  --
Reply

Marsh Posté le 03-01-2012 à 18:59:00    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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