fwrite / fread

1. fwrite / fread

elayne
membroC

(usa Linux Mint)

Enviado em 22/04/2019 - 21:31h

Boa Noite !
Estou com um problema de gravação e leitura de um arquivo binário.
Pra simplificar, eu tenho uma estrutura de 10 posicoes fixas e cada um dela tem um vetor e dados. Eu quero salvar toda essa estrutura no arquivo binario, e ao executar novamente preciso lê o que salvei para recomecar o programa de onde parei. No meu, quando recomeco dá falha de seguimentação. Alguém pode me ajudar ?

typedef struct estrutura {
int tamanho;
int numero;
int *vetor;
int fim;
int posicao;
struct estrutura *proximo;
} principal;

void salvar_binario (principal *inicio, FILE *arq){
principal *aux_principal;

for (aux_principal=inicio->proximo; aux_principal!=NULL; aux_principal=aux_principal->proximo){
fwrite (&aux_principal->tamanho, sizeof (principal), 1, arq);
fwrite (&aux_principal->numero, sizeof (principal), 1, arq);
fwrite (&aux_principal->fim, sizeof (principal), 1, arq);
fwrite (&aux_principal->posicao, sizeof (principal), 1, arq);

for (int i=0; i<aux_principal->fim; i++){
fwrite(&aux_principal,sizeof(aux_principal->vetor[i]), 1, arq);
}
}

}
void leitura_binario (principal *inicio,FILE *arq){
principal *aux_principal;

for (aux_principal=inicio->proximo; aux_principal!=NULL; aux_principal=aux_principal->proximo){

fread (&aux_principal->tamanho, sizeof (principal), 1, arq);
fread (&aux_principal->numero, sizeof (principal), 1, arq);
fread (&aux_principal->fim, sizeof (principal), 1, arq);
fread (&aux_principal->posicao, sizeof (principal), 1, arq);

if (aux_principal->tamanho > 0){
aux_principal->vetor= (int *)malloc((aux_principal->tamanho)*sizeof(int));
if (aux_principal->vetor == NULL){
printf ("Memoria insuficiente\n");
} else
for (int i=0; i<aux_principal->fim; i++){
fread(&aux_principal->vetor[i], sizeof(aux_principal->vetor[i]), 1 , arq);
}
}

}

fclose (arq);
}



  


2. Re: fwrite / fread

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/04/2019 - 01:06h

membroC escreveu:

Boa Noite !
Estou com um problema de gravação e leitura de um arquivo binário.
Pra simplificar, eu tenho uma estrutura de 10 posicoes fixas e cada um dela tem um vetor e dados. Eu quero salvar toda essa estrutura no arquivo binario, e ao executar novamente preciso lê o que salvei para recomecar o programa de onde parei. No meu, quando recomeco dá falha de seguimentação. Alguém pode me ajudar ?

typedef struct estrutura {
int tamanho;
int numero;
int *vetor;
int fim;
int posicao;
struct estrutura *proximo;
} principal;

void salvar_binario (principal *inicio, FILE *arq){
principal *aux_principal;

for (aux_principal=inicio->proximo; aux_principal!=NULL; aux_principal=aux_principal->proximo){
fwrite (&aux_principal->tamanho, sizeof (principal), 1, arq);
fwrite (&aux_principal->numero, sizeof (principal), 1, arq);
fwrite (&aux_principal->fim, sizeof (principal), 1, arq);
fwrite (&aux_principal->posicao, sizeof (principal), 1, arq);


Se você está gravando apenas alguns valores inteiros, por que está dizendo que o tamanho a ser gravado é o de uma estrutura inteira? O certo seria fazer o seguinte:
		fwrite (&aux_principal->tamanho, sizeof aux_principal->tamanho, 1, arq);
fwrite (&aux_principal->numero, sizeof aux_principal->numero, 1, arq);
fwrite (&aux_principal->fim, sizeof aux_principal->fim, 1, arq);
fwrite (&aux_principal->posicao, sizeof aux_principal->posicao, 1, arq);



for (int i=0; i<aux_principal->fim; i++){
fwrite(&aux_principal,sizeof(aux_principal->vetor[i]), 1, arq);


Aqui também está errado, mas de um jeito diferente: você tentou gravar cada elemnto do vetor, mas errou o endereço inicial, apontando para o início da estrutura, em lugar de para cada elemnto do array. Além de corrigir isso, você ainda pode se valer do fato de que todos os elementos do array têm o mesmo tamanho, e não especificar um índice variável no cálculo feito com sizeof.
			fwrite(&aux_principal->vetor[i], sizeof aux_principal->vetor[0], 1, arq); 


		} 


Mas dá para simplificar mais ainda, aproveitando-se o fato de que os elementos em uso do array estão em posições contíguas da memória, para então trocar todo o laço de repetição por uma única chamada a fwrite().
		fwrite(aux_principal->vetor, sizeof aux_principal->vetor[0], aux_principal->fim, arq); 


	}

}


Mudanças correspondentes podem e devem ser feitas na função de leitura.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts