Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

1. Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

Joice Aurino Lima
joyaurino

(usa Lubuntu)

Enviado em 02/04/2017 - 10:31h

Gente, eu não consigo gravar os dados da minha struct no arquivo binário, alguém pode me ajudar?
Segue o código:

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

typedef struct REGISTER{
int TAM_REGISTER;
int tam_name;
char *name;
int tam_email;
char *email;
int tam_number;
int number;
int tam_complement;
char *complement;
}reg;

void arquivaPessoa(){
FILE *fp = fopen("register.dat", "ab");
char nome[50], rua[50], comp[20];
reg *rg;
rg = (reg*) malloc (sizeof(reg));

getchar();
printf("\n>>Nome: ");
scanf("%[^\n]", nome);
rg -> tam_name = strlen(nome);
rg -> name = (char*) malloc((rg -> tam_name + 1) * sizeof(char));
strcpy(rg -> name, nome);

getchar();
printf("\n>>Endereco: ");
scanf("%[^\n]", rua);
rg -> tam_email = strlen(rua);
rg -> email = (char*) malloc((rg -> tam_email + 1) * sizeof(char));
strcpy(rg -> email, nome);

getchar();
printf("\n>>Complemento: ");
scanf("%[^\n]", comp);
rg -> tam_complement = strlen(comp);
rg -> complement = (char*) malloc((rg -> tam_complement + 1) * sizeof(char));
strcpy(rg -> complement, nome);

printf("\n>>Numero: ");
scanf("%d", &rg -> number);


rg -> TAM_REGISTER = ((rg -> tam_name) + (rg -> tam_email) + (rg -> tam_complement) + ( 5 * sizeof(int)));

fwrite(&rg -> TAM_REGISTER, sizeof(int), 1, fp);
fwrite(&rg -> tam_name, sizeof(int), 1, fp);
fwrite(rg -> name, sizeof(rg -> tam_name), 1, fp);
fwrite(&rg -> tam_email, sizeof(int), 1, fp);
fwrite(rg -> email, sizeof(rg -> tam_email), 1, fp);
fwrite(&rg -> tam_number, sizeof(int), 1, fp);
fwrite(&rg -> number, sizeof(int), 1, fp);
fwrite(&rg -> tam_complement, sizeof(int), 1, fp);
fwrite(rg -> complement, sizeof(rg ->tam_complement), 1, fp);

fclose(fp);
free(rg);
}

void recuperaPessoa(){
FILE *fp = fopen("register.dat", "rb");
reg *r;
r = (reg*) malloc(sizeof(reg));
int c = 0;

fseek(fp, 0, SEEK_SET);
while (!feof){
printf("\nRegistro: %d", c);

fread(&r->TAM_REGISTER, sizeof(int), 1, fp);
printf("\nTamanho do registro em bytes: %d", r->TAM_REGISTER);

fread(&r -> tam_name, sizeof(int), 1, fp);
printf("\nTamanho do campo em bytes: %d", r -> tam_name);
r -> name = (char*) malloc(r -> tam_name * sizeof(char));
fread(r -> name, sizeof(r -> tam_name), 1, fp);
printf("\nNome: %s", r -> name);

fread(&r -> tam_email, sizeof(int), 1, fp);
printf("\nTamanho do campo em bytes: %d", r -> tam_email);
r -> email = (char*) malloc(r -> tam_email * sizeof(char));
fread(r -> email, sizeof(r -> tam_email), 1, fp);
printf("\nEndereco: %s", r -> email);

fread(&r -> tam_number, sizeof(int), 1, fp);
printf("\nTamanho do campo em bytes: %d", r -> tam_number);
fread(&r -> number, sizeof(int), 1, fp);
printf("\nNumero: %d", r -> number);

fread(&r -> tam_complement, sizeof(int), 1, fp);
printf("\nTamanho do campo em bytes: %d", r -> tam_complement);
r -> complement = (char*) malloc(r -> tam_complement * sizeof(char));
fread(r -> name, sizeof(r -> tam_complement), 1, fp);
printf("\nComplemento: %s", r -> complement);

free(r);
c++;
}

fclose(fp);
}

int main()
{
int op = -1;

while(op != 0){

printf("\n\n>>1 - Registrar Pessoa");
printf("\n>>2 - Recuperar registros");
printf("\n>>0 - Sair");
printf("\n>> Opcao:");
scanf("%d", &op);

switch(op){
case 1:
arquivaPessoa();
break;

case 2:
recuperaPessoa();
break;


default:
printf("\n>>Opcao invalida, tente novamente<<");
}
}
return 0;
}



  


2. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

arthur
arfad

(usa Mandriva)

Enviado em 02/04/2017 - 10:39h

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


3. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

Joice Aurino Lima
joyaurino

(usa Lubuntu)

Enviado em 02/04/2017 - 10:43h

arfad escreveu:

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


Não deu certo, eu dei um fread, logo dp do fwrite e ele retorna 0;


4. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

arthur
arfad

(usa Mandriva)

Enviado em 02/04/2017 - 11:15h

joyaurino escreveu:

arfad escreveu:

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


Não deu certo, eu dei um fread, logo dp do fwrite e ele retorna 0;


NA verdade vc não precisa gravar todos os dados separados, é só fazer assim;

fwrite(ponteiro_struct,sizeof(nome),1,arquivo);



5. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

arthur
arfad

(usa Mandriva)

Enviado em 02/04/2017 - 11:15h

joyaurino escreveu:

arfad escreveu:

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


Não deu certo, eu dei um fread, logo dp do fwrite e ele retorna 0;


NA verdade vc não precisa gravar todos os dados separados, é só fazer assim;

fwrite(ponteiro_struct,sizeof(nome),1,arquivo);



6. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

Joice Aurino Lima
joyaurino

(usa Lubuntu)

Enviado em 02/04/2017 - 11:22h

arfad escreveu:

joyaurino escreveu:

arfad escreveu:

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


Não deu certo, eu dei um fread, logo dp do fwrite e ele retorna 0;


NA verdade vc não precisa gravar todos os dados separados, é só fazer assim;

fwrite(ponteiro_struct,sizeof(nome),1,arquivo);


já tentei desse jeito, mas não deu certo :(


vou tentar p ver


7. Re: Gravar dados de uma struct com ponteiro em arquivo binário na linguagem C.

Joice Aurino Lima
joyaurino

(usa Lubuntu)

Enviado em 02/04/2017 - 11:40h

joyaurino escreveu:

arfad escreveu:

joyaurino escreveu:

arfad escreveu:

R já é um ponteiro então não precisa do do & antes dele e sim no endereço dele.
Tenta assim:
fwrite(&(r -> tam_name), sizeof(int), 1, fp);


Não deu certo, eu dei um fread, logo dp do fwrite e ele retorna 0;


NA verdade vc não precisa gravar todos os dados separados, é só fazer assim;

fwrite(ponteiro_struct,sizeof(nome),1,arquivo);


já tentei desse jeito, mas não deu certo :(


vou tentar p ver


void arquivaPessoa(){
FILE *fp = fopen("register.dat", "a+b");
char nome[50], rua[50], comp[20];
reg *rg;
rg = (reg*) malloc (sizeof(reg));

getchar();
printf("\n>>Nome: ");
scanf("%[^\n]", nome);
rg -> tam_name = strlen(nome);
rg -> name = (char*) malloc((rg -> tam_name + 1) * sizeof(char));
strcpy(rg -> name, nome);

getchar();
printf("\n>>Endereco: ");
scanf("%[^\n]", rua);
rg -> tam_email = strlen(rua);
rg -> email = (char*) malloc((rg -> tam_email + 1) * sizeof(char));
strcpy(rg -> email, nome);

getchar();
printf("\n>>Complemento: ");
scanf("%[^\n]", comp);
rg -> tam_complement = strlen(comp);
rg -> complement = (char*) malloc((rg -> tam_complement + 1) * sizeof(char));
strcpy(rg -> complement, nome);

printf("\n>>Numero: ");
scanf("%d", &rg -> number);


rg -> TAM_REGISTER = ((rg -> tam_name) + (rg -> tam_email) + (rg -> tam_complement) + ( 5 * sizeof(int)));

fwrite(rg, sizeof(reg), 1, fp);
free(rg);

rg = (reg*) malloc (sizeof(reg));

fread(rg, sizeof(reg), 1, fp);

printf("\nTamanho do registro em bytes: %d", rg -> TAM_REGISTER);

printf("\nTamanho do campo em bytes: %d", rg -> tam_name);
rg -> name = (char*) malloc(rg -> tam_name * sizeof(char));
printf("\nNome: %s", rg -> name);

printf("\nTamanho do campo em bytes: %d", rg -> tam_email);
rg -> email = (char*) malloc(rg -> tam_email * sizeof(char));
printf("\nEndereco: %s", rg -> email);

printf("\nTamanho do campo em bytes: %d", rg -> tam_number);
printf("\nNumero: %d", rg -> number);
fclose(fp);

printf("\nTamanho do campo em bytes: %d", rg -> tam_complement);
rg -> complement = (char*) malloc(rg -> tam_complement * sizeof(char));
printf("\nComplemento: %s", rg -> complement);
}


nos tamanhos sai sempre 0 e nos campos sai coisas nada a ver, não está guardando nada no arquivo.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts