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

so_simple

Duvida algo complicado...Urgente

6 mensagens neste tópico

Eu tenho esta struct

typedef struct{
int n_unidade;
int n_aval;
char *desc_aval;
float *crit_aval;
float *nota;
}avaliacao;

e escrevo para um ficheiro assim!

void adicionar_aval(unidade *u,int total){
FILE *a;
avaliacao temp;
int i, n_unidade,cont;
float crit,soma=0;
titulo_registos();

for (i=0;i<total;i++)
{
	if (u[i].estado==2){
		escrever_registos(u,i,i+1);
		cont++;
	}
}
printf("Escolha a unidade curricular a inserir avaliacoes: ");
scanf("%d",&n_unidade);
system("clear");
titulo();
temp.n_unidade=n_unidade;
printf("Insira o numero de avalicoes: ");
scanf("%d",&temp.n_aval);

temp.nota=(float*)malloc(temp.n_aval*sizeof(float));
temp.crit_aval=(float*)malloc(temp.n_aval*sizeof(float));
do{
for (i=0;i<temp.n_aval;i++){
printf("Insira o criterio para a avaliacao #%d (ex: 60%% escreva 60): ",i+1);
scanf("%f",&crit);
temp.crit_aval[i]=crit/10;
temp.nota[i]=0;
soma=soma+crit;
}
if (soma!=1){
system("clear");
titulo();
printf("A soma das avalicoes tem de ser 100! Insira novamente...");
}
}while(soma!=1);

a=fopen("avaliacao.dat","a+b");
fwrite(&temp,sizeof(avaliacao),1,a);
fclose(a);
free(temp.nota);
free(temp.crit_aval);
}

À partida acho que esta a escrever bem!

Estou a ler o ficheiro assim

n_avaliacoes=contar_registos("avaliacao.dat",2);
a=(avaliacao*)malloc(n_avaliacoes*sizeof(avaliacao));
f2=fopen("avaliacao.dat","rb");
fread(a,sizeof(avaliacao),n_avaliacoes,f2);
fclose(f2);

Agora alguem me explica como escrever no ecra o conteudo do array 'a' que foi lido do ficheiro??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

for(i=0;i<n_avaliacoes;i++)
  printf("%d\n",a[i].n_unidade);

algo como isto deve dar (assumindo que as operações de leitura e escrita estão a funcionar).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois isso ja eu sei!

o problema é escrever por ex.

a[ i].crit_aval[j] isto parece-me que nao funciona!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim derrepente, parece-me que estás a escrever e ler um valor de um ponteiro do ficheiro.

Este ponteiro só é válido no processo da aplicação, de pouco te vale guardar isso.

O que tens de fazer é guardar os valores do array a[ i].crit_aval. E convinha ter o tamanho de cada array para leres previamente o numero de elementos, tal como fizeste no contar_registos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas isso ja tenho na struct!

tenho la uma var que se chama n_aval que indica quantas posicoes os vectores vao ter!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Certo. Mas vejo 3 ponteiros para 2 contadores. A não ser que um dos ponteiros não seja um array.

Mas o problema nem é esse.

O problema é: Estás a escrever posições de memória (ponteiros) no ficheiro. Quando voltas a ler do file para a estrutura, esse ponteiro não é válido. Porque os ponteiros tem valores dinâmicos não são estáticos.

O endereço de memória que é válido para o processo agora , pode não ser quando o executares novamente.

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