Jump to content
Fórum Script Brasil
  • 0

[AJUDA] Gravar struct em arquivo


ThaisM
 Share

Question

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!

Edited by ThaisM
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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);

Edited by Ezequiel A. Ribeiro
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.8k
×
×
  • Create New...