Ir para conteúdo
Fórum Script Brasil
  • 0

[AJUDA] Gravar struct em arquivo


ThaisM

Pergunta

Olá!

Será que alguém poderia me ajudar?

Estou fazendo um programa no qual é necessário criar um arquivo para gravar as informações que já foram digitadas. Estou usando uma função para chamar o código que está criando os arquivos e guardando as informações...

No entanto não estou conseguindo gravar as informações através da struct que criei. Quando eu abro o programa novamente, não consigo recuperar as informações.

Acredito que esteja gravando somente o ponteiro e não as informações em si. Será que alguém teria alguma ideia pra me ajudar?

Aqui vai o código.

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

#define MAX1 1000


//////////////////////////////STRUCT

struct livro{
char nomedolivro[17];
int area;
char autores[60];
char editora[20];
};


/////////////////////////////////////////////////////////FUNCAO CADASTRAR LIVROS
void cadastrarLivros(struct livro livros[MAX1], int *contlivros){
 int ii;
 int *pont;

FILE *fptr;
FILE *guarda1;


///////////////////LENDO QUAL POSIÇÃO (QUANTOS LIVROS JÁ CADASTRADOS)
guarda1=fopen("guardaponteiro1.txt","r");
int x=0;

while(fscanf(guarda1, "%i",  &x) > 0)
{
   fprintf(guarda1, "%i", x);
   printf("\n%i", x);
   printf("\nVALOR PONTEIRO");
}



///////////////////ESCREVENDO INFORMAÇÕES
if ((fptr = fopen("pessoas", "wb")) == NULL){
printf("\nErro na abertura do arquivo");

}else{
contlivros=&x;
   do{
   printf("\nDigite o Nome do Livro: ");
   gets(livros[*contlivros].nomedolivro);
   
   }while(strlen(livros[*contlivros].nomedolivro)==0);
   fwrite(&livros, sizeof(livro), 1, fptr);
   
*contlivros=*contlivros+1;
fclose(fptr);
}

///////////////////LENDO INFORMAÇÕES
if ((fptr = fopen("pessoas", "rb")) == NULL)
    printf("\nErro na abertura do arquivo");
else{
  while(fread(&livros, sizeof(livro), 1, fptr) == 1){
  for(ii = 0; ii <=*contlivros-1; ii++){
  printf("\nNome: %s\n",livros[ii].nomedolivro);
     }
    }
    fclose(fptr);
}


///////////////////GUARDANDO PONTEIRO
guarda1=fopen("guardaponteiro1.txt","w");
if(guarda1==NULL){
printf("\n erro");
}else{
pont=contlivros;
fprintf(guarda1, "%i", *pont);
//printf("\n%i", *pont);
fclose(guarda1);
}

///////////////////LENDO PONTEIRO
if ((fptr = fopen("guardaponteiro1.txt", "r")) == NULL){
printf("\nErro na abertura do arquivo");
}else{
while (!feof(guarda1)){
fscanf(guarda1,"%i",&*pont);
printf("\n%i",*pont);
} 
}
fclose(guarda1);



};////final funcao



////////////////////////////////////////////////
main(){

struct livro livros[MAX1];
int opcao,contlivros=0;


do{
   printf("\n\n");
   printf("\n Escolha sua opcao");
   printf("\n 1 - Cadastrar livros");
   printf("\n OPCAO: ");
   scanf("%d", &opcao);
   fflush(stdin);
   
   switch(opcao){
   
   case 1:{
   cadastrarLivros(livros, &contlivros);
  //criar documento adicionando livros
   break;
   }
   
            
   case 0:{
   break;
   }
               
   default:{
   printf("\n \n =====OPCAO INVALIDA===== \n \n");
   break;
   }
   }
}while (opcao!=0);

}

Obrigada!

Editado por ThaisM
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Meu amigo para gravar estruturas use o fwrite e o fread.

A forma que você está usando para gravar é apenas para caracteres e não estruturas.

O C não saberá localizar dentro do arquivo txt a sua estrutura gravada.

Ao invés de gravar em um .txt você irá gravar em um .dat

Vou tentar explicar.....quando você grava uma estrutura ele utiliza o tamanho da mesma para posiciona -la no arquivo corretamente para depois poder localizar -la.

Para gravar estruturas o C irá verificar o tamanho delas através do comando sizeof(livro).

Vamos supor que sizeof retornou o tamanho da sua estrutura como sendo 100. Então da posição 0 a 99 ele irá gravar o primeiro registro, da posição 100 a 199 o segundo e assim por diante.

Para localizar o registro de número 1 o C irá faze irá fazer -lo através do tamanho do mesmo, nesse exemplo como a estrutura tem tamanho 100 do 0 ao 99 corresponderá o registro número 1.

Tem esse exemplo aqui : http://programacaoobjetiva.blogspot.com.br...s-em-disco.html

Dá uma olhada.

Olhe um exemplo de gravação de estruturas.

rewind(pont);

fseek(pont,(pedido.pedidoNumero -1) * sizeof(pedido),SEEK_SET);

fwrite(&pedido,sizeof(pedido),1,pont);

Agora um exemplo de leitura:

fseek(pont,(pedidoNumero -1) * sizeof(Pedido),SEEK_SET);

fread(&pedidoLeitura,sizeof(pedidoLeitura),1,pont);

Editado por Ezequiel A. Ribeiro
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...