• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

so_simple

Ler/Escrever estruturas com elementos dinamicos em ficheiros

4 mensagens neste tópico

A algum tempo tive esta duvida e ninguem me conseguiu responder!

O problema era escrever e ler de um ficheiro estruturas com elementos dinamicos! O que me acontecia e que escrevia a estrutura mas n escrevia os seus elementos dinamicos...

Entao fica aqui um pequeno exemplo de codigo de como escrever e depois ler estruturas com elementos dinamicos

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

typedef struct {
  int d, m;
}data;

typedef struct {
  int ne, nd;
  char nome[100];
  data *d;
  float *vect;
}FICHA;

main()
{
      int i,j,k;
      FILE *pf, *pfb;
      FICHA a, b, *p, *x;
  char *s1="Frutuoso S."; 
  char *s="F. Silva ";
    
  p=(FICHA *)malloc(3*sizeof(FICHA));
   
  //Preencher duas Fichas para testar
  p[0].ne=2;
  p[0].nd=2;
  strcpy( p[0].nome, s1);
   p[0].vect=(float *)malloc(p[0].ne*sizeof(float));
   p[0].vect[0]=10.1;
   p[0].vect[1]=11.2;
   p[0].d=(data *)malloc(p[0].nd*sizeof(data));
   p[0].d[0].d=10;
   p[0].d[0].m=10;
   p[0].d[1].d=11;
   p[0].d[1].m=11;

  p[1].ne=3;
  p[1].nd=1;
  strcpy(p[1].nome, s);
  p[1].vect=(float *)malloc(p[1].ne*sizeof(float));
  p[1].vect[0]=100.1;
  p[1].vect[1]=101.2;
  p[1].vect[2]=102.3;
   p[1].d=(data *)malloc(p[1].nd*sizeof(data));
   p[1].d[0].d=20;
   p[1].d[0].m=12;
  
  p[2].ne=4;
  p[2].nd=3;
  strcpy(p[1].nome, s);
  p[2].vect=(float *)malloc(p[2].ne*sizeof(float));
  p[2].vect[0]=100.1;
  p[2].vect[1]=101.2;
  p[2].vect[2]=102.3;
  p[2].vect[3]=103.4;
   p[2].d=(data *)malloc(p[2].nd*sizeof(data));
   p[2].d[0].d=1;
   p[2].d[0].m=5;
   p[2].d[1].d=10;
   p[2].d[1].m=15;
   p[2].d[2].d=10;
   p[2].d[2].m=20;
  
   //----------------------------------------------------
  //Escrever para um ficheiro bin‡rio as 2 fichas
  
  pfb=fopen("fichBin1.dat","wb");

      if(pfb==NULL)
      {
        printf("Erro na abertura do ficheiro bin‡rio\n");
        exit(0);
      }	  
  //Para cada Estrutura 
  //GRAVAR AS COMPONENTES DINåMICAS SEPARADAMENTE!
  for(j=0; j<3; j++) {  
	  //Grava a Estrutura FICHA - principal
	  fwrite(&p[j], sizeof(FICHA), 1, pfb); 
	  //Grava Vector din‰mico
	  fwrite(p[j].vect, sizeof(float), p[j].ne, pfb); 
	  //Grava estrutura Data din‰mica
	  fwrite(p[j].d, sizeof(data), p[j].nd, pfb); 				  
  }
  fclose(pfb);
  //----------------------------------------------------
  //Ler do ficheiro bin‡rio
  
  pfb=fopen("fichBin1.dat","rb");

      if(pfb==NULL)
      {
        printf("Erro na abertura do ficheiro bin‡rio\n");
        exit(0);
      }
  
  //Para cada Estrutura 
  //LER A ESTRUTURA E AS COMPONENTES DINåMICAS SEPARADAMENTE!
  i=0;
  x=(FICHA *)malloc(1*sizeof(FICHA));
  
  while(!feof(pfb)){
	  fread(&x[i], sizeof(FICHA), 1, pfb);			//L ficha principal

	  x[i].vect=(float *)malloc(x[i].ne*sizeof(float)); 
	  fread(x[i].vect, sizeof(float), x[i].ne, pfb);	//L Vector din‰mico

	  x[i].d=(data *)malloc(x[i].nd*sizeof(data));
	  fread(x[i].d, sizeof(data), x[i].nd, pfb);		//L estrutura Data din‰mica

	  i++;
	  x=(FICHA *)realloc(x, (i+1)*sizeof(FICHA));
  }
  i--;  //Retira um pois corresponde ao fim do ficheiro!
      x=(FICHA *)realloc(x, (i+1)*sizeof(FICHA));
  
  printf("Num de registos lidos = %d\n", i);
  	  
  printf("ESCREVE FICHAS: \n");
      for(j=0; j<i; j++) {
   printf("NE=%d \nNome= %s \n", x[j].ne, x[j].nome);
   for(k=0; k<x[j].ne; k++)
	  printf("vect=%.2f \n", x[j].vect[k]);
   
   for(k=0; k<x[j].nd; k++)
	   printf("D=%d  M=%d \n", x[j].d[k].d, x[j].d[k].m);

   printf("\n");
      }
  close(pfb);
  
  free(x);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não foi bem não te terem conseguido explicar. Foi mais... só agora é que entendeste que estavas a escrever ponteiros para um ficheiro,e que isso não tinha significado nenhum.

Mesmo assim estás a escrever-los na mesma, mas como depois na leitura escreves por cima ao chamar o malloc, passa despercebido e não afecta o programa, mas não deixa de estar errado, porque é lixo que vai para o ficheiro.

Serve como exemplo, e se quiseres dar-te ao trabalho de separar a leitura e escrita tipo em cada função (load/save), ficava mais organizado, assim como os dados de teste e o print para o "cout". Além disso separar assim é uma passo para começares a entender e programar em  C++. Se quiseres claro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

muito obrigado por teres posto aqui uma dúvida que esclareceste. para que nao aconteça aos outros. eu tive o mesmo problema e resolvi escrevendo mesmo num ficheiro de texto todos os campos da estrutura. depois para ler era criar 1 estrutura desse tipo e preencher com os campos do ficheiro. muito mais ridiculo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora