CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

pb fread

omegasf3
omegasf3
Niveau 8
18 novembre 2005 à 14:42:47

Salut
j´a un problem avec fread en fait en utilise des liste
chainer e on aimerai les sauvegardes dans un fichier
pour les retrouver on utilise fwrite et ça marche (on
retrouve nos structure en cripter dans le fichier)
mais quan j´utilise fread ça marche pas ça me met des
chiane vide
voici la structure:
typedef struct tache { int annee, mois, jours, heured,
minuted, heuref, minutef; char sujet[8]; struct tache

  • precedent; struct tache * suivant;}tache_t;

tache_t *premier;

voici la fonction qui affiche

void affiche2()
{
//printf("\nliste : \n");
tache_t * debut;
debut=(tache_t *)malloc(sizeof(tache_t));
fread(debut,sizeof(tache_t),Nb_index,Fp_index);
printf("Lundi %c%c Mardi %c%c Mercredi %c%c
Jeudi %c%c Vendredi %c%c Samedi %c%c Dimanche

%c%c\n",tab[0],tab[1],tab[3],tab[4],tab[6],tab[7],
tab[9],tab[10],tab[12],tab[13],tab[15],tab[16],tab
[18],tab[19]);
printf("\n");
while(debut!=NULL)
{
printf("%dh:",debut->heured);
printf("%s\n ",debut->sujet);
debut=debut->suivant;
}
printf("\n");
}
merci de votre aide

dnob700
dnob700
Niveau 10
18 novembre 2005 à 18:28:33

Et bien, tout dépend de la manière dont tu écrit tes données. Mais à priori tu confond deux choses : les tableau et les listes chainée : si tes données forment vraiment une liste chainée : donc que la mémoire est alloué pour chaque élément indépendamment, il faut les écrire dans le ficheir de cette manière :

tache_t * debut; // Il faut l´allouer quelque part.
...
void ecrire()
{
while(debut!=NULL)
{
fwrite(debut,sizeof(tache_t),1,Fp_index);
debut=debut->suivant;
}
}

Et ensuite, tu doit lire tes données une par une ou toutes d´un coup dans un tableau, mais dans tout les cas, tu doit recréer les liens entre les différend éléments qui bien sur ne sont plus valables (les pointeurs suivant doivent être mis à jour).

omegasf3
omegasf3
Niveau 8
19 novembre 2005 à 21:58:49

c´est a peu pres ce que j´ai fait dans la fonction qui ecrit tient la voila:

void lecture2(void)
{
tache_t *precedent,*nouveau;

premier=(tache_t*)malloc((Nb_index+10)*sizeof(tach
e_t));
if (premier==NULL) {
printf("Erreur d´allocation mémoire !! !");
exit(1);
}
//printf("entrez un jours\n");
//scanf("%d",&premier->jours);
printf("entrez une heure de debut\n");
scanf("%d",&premier->heured);
printf("entrez une activité\n");
scanf("%s",premier->sujet);
fseek(Fp_index,0l,SEEK_SET);
fwrite(premier,sizeof(tache_t),1,Fp_index);
Nb_index++;
precedent=premier;
while (encore()==1)
{
nouveau=(tache_t *)malloc(sizeof(tache_t));
precedent->suivant=nouveau;
precedent=nouveau;
printf("entrez une heure de debut\n");
scanf("%d",&nouveau->heured);
printf("entrez une activité\n");
scanf("%s",nouveau->sujet);
fwrite(nouveau,sizeof(tache_t),1,Fp_index);
Nb_index++;
}
precedent->suivant=NULL;
}
donc je voit pas ce qui vas pas...........

dnob700
dnob700
Niveau 10
19 novembre 2005 à 22:11:25

pas mal de truc.

d´abord ton allocation de premier :

premier=(tache_t*)malloc((Nb_index+10)*sizeof(tach
e_t));

pourquoi allouer tout un tableau alors quetu ne t´en sers jamais vu que tu réalloue chaque nouvel élément ?

Mais le problème vient comme je te l´ais dit de la lecture :
tache_t * debut;
debut=(tache_t *)malloc(sizeof(tache_t));
fread(debut,sizeof(tache_t),Nb_index,Fp_index);

tu alloue un seul élément et tu en lit Nb_index.
Ou bien tu fait :
tache_t *debut;
debut=(tache_t *)malloc(sizeof(tache_t)*Nb_index);

ou bien tu n´en lis qu´un seul à la fois.

Dans tout les cas, tu ne peut pas utiliser debut->suivant qui n´est plus valide car entre différente exécution ou allocation de la mémoire les variables ne se retrouve pas à la même place. C´est pour ça que ton programme ne marche pas. Tu doit ou bien mettre tout ce que tu charge ans un tableau et appeler les différent éléments du tableau avec l´opérateur [] ou bien tu charge un par un tes élément et à chaque fois que tu en charge un nouveau, tu mets son adresse dans le membre suivant d´un des éléments de ta liste.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment