Aide : charger un tableau de structures dans un fichier et vice versa !!

Signaler
Messages postés
29
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
1 août 2011
-
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
-
salut les amis j'ai une question à vous poser.

ben je voudrais que quelqu'un m'aide sur deux fonctions,l'une permette de charger les données stocker dans un fichier F sous forme de structures bien ordonnées,dans un tableau T de structures tel que la premiere struture dans le fichier F soit chargée exactement dans la premiere cellule du tableau T càd T[0],et que la deuxieme structure dans le fichier F soit chargée exactement dans la deuxieme cellule du tableau T càd T[1],et ainsi de suite jusqu'à qu'on aboutit la fin du fichier F,quant à la deuxieme fonction fera le même travail mais dans le sens inverse,càd stocker les données d'un tableau de structures T' dans un fichier F' tel que T'[0] soit la premiere à stocker dans le fichier F' et T'[1] soit la deuxieme et ainsi de suite jusqu'à qu'on aboutit à la derniere donnée T'[n],mais tout en respectant l'ordre d'enregitrement,càd si on veut recuperer les données du fichier F' et qu'on veut les stocker dans un tableau de structures T" on dois stocker la premiere structure dans le fichier F' qui dans notre càs T'[0] soit chargée exactement dans la premiere cellule du tableau T" càd T"[0] et ainsi de suite,ça à l'air beaucoup de bavarderie mais desolé je n'ai pas d'autre choix pour vous expliquer ce que j'ai affronti .

bon voici les deux fonctions que j'ai construit même si tout dans mon code ça a l'air logique,pourtant il m'affiche des erreurs logiques :

//la structure

typedef struct STR
{
int x;
int y;
char s[25];
}STR;

//la fonction qui permet de charger un fichier dans un tableau de structures.

int chargement(STR tab[],FILE *ptr)
{
int i=0;
place q;
ptr=fopen("fichier.txt","r");
while ((fread(&q, sizeof(place), 1, ptr))!=0)
{
strcpy(tab[i].s,q.s);
tab[i].x=q.x;
tab[i].y=q.y;
i++;
}
fclose(ptr);
return 0;
}

//lafonction qui permet de sauvegarder un tableau dans un fichier.

int sauvegarde (STR t[],FILE* help)
{
help=fopen("help.txt","w");
if (help!=NULL)
{
for (i=0;i<100;i++)
{
fwrite(&t[i],sizeof(place),1,help);
}
}
fclose(help);
return 0;
}

si quelqu'un peut me mentioner ou se trouve les erreurs dans mon code source ainsi de les corriger,ou me proposer une autre solution qui permettra d'effectuer la même tache je serais vraiment trop reconaissant .
et merci d'avance.

3 réponses

Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Bonjour,

Tu peux commencer par ouvrir tes fichiers en binaire car si on ne le précise pas lors de l'ouverture, celle-ci se fait en mode texte.

ptr=fopen("fichier.txt","rb");

help=fopen("help.txt","wb");

De plus, quel est l'intèrêt de passer les FILE * en paramètres ? Puisque tu ne t'en sers qu'à l'intérieur des fonctions.
Messages postés
29
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
1 août 2011
3
@ed73 :

merci pour tes conseils,j'ai essayeé le truc du fichier binaire mais ça ne marche toujours pas,il y a toujours des erreurs logiques,j'ai verifié mon code source plusieurs fois et je me suis rendu compte que l'erreur est bel et bien de ces deux fonctions ,alors si c'est possible de me reproposer une autre solution en rectifiant mes deux fonctions ou bien de me proposer tes deux propres fonctions et merci d'avance .
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Ceci fonctionne chez moi (j'ai retiré tes boucles, puisque fread et fwrite sont capables d'écrire des blocks, pas besoin de les faire un par un):

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

#define MAX 3

typedef struct
{
  int x;
  int y;
  char s[25];
} STR;

int chargement(STR tab[], const char* filename)
{
  FILE* ptr = fopen(filename, "rb");
  if (!ptr)
    return 0;
  fread(tab, sizeof(STR), MAX, ptr);

  fclose(ptr);
  return 1;
}

int sauvegarde(STR tab[], const char* filename)
{
  FILE* help = fopen(filename, "wb");
  if (!help)
    return 0;

  fwrite(tab, sizeof(STR), MAX, help);


  fclose(help);
  return 1;
}

void affichage(STR t[])
{
  int i = 0;
  for (i = 0; i < MAX; ++i)
    printf("%i: x %i, y %i, s = %s\n", i, t[i].x, t[i].y, t[i].s);
}

int main(void)
{
  STR tab[MAX] =
    {
      {1, 1, "Pouet"},
      {5,18, "Toto"},
      {45, 23, "Kikoo"}
    };
  STR pouet[MAX];

  sauvegarde(tab, "help.txt");
  chargement(pouet, "help.txt");
  affichage(pouet);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]