Problème de lecture d'un fichier avec fread - C - Programmation
Marsh Posté le 31-12-2011 à 09:53:37
Avec quelque ligne de code ça serait moins hasardeux
Marsh Posté le 01-01-2012 à 11:11:15
Code :
|
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 >< )
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+,
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
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.
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 ?
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.
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+,
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 =/
Marsh Posté le 01-01-2012 à 19:23:26
Comment tu écris dans ton fichier ? Tu peux montrer le code ?
Marsh Posté le 01-01-2012 à 19:40:52
Code :
|
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.
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à =/
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....
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...
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+,
Marsh Posté le 02-01-2012 à 17:01:40
Voici la définition de ma structure :
Code :
|
elle utilise cette deuxième structure :
Code :
|
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+,
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.=/
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+,
Marsh Posté le 02-01-2012 à 17:59:17
Poster ici le code avec ledit fscanf qui marche pas
A+,
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.
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 :
|
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 :
|
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 :
|
Ce qui donne en sortie:
Date:31/12/2011 File: fic1 Name: Toto |
Variante quand on connait pas le nombre exact de records inscrits:
Code :
|
A+,
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
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 !