Jump to content

Memória dinâmica + estruturas + ficheiros


Go to solution Solved by TheDark,

Recommended Posts

Posted

Boas. Tenho um trabalho do género para desenvolver e encontro-me com o mesmo problema.. Já consegui guardar uma estrutura num ficheiro *.dat mas não a consigo ler do ficheiro e guardá-la num vector de estruturas para mostrar ao utilizador.. Alguma dica?  :down:

Posted
int gravarLivroFicheiro(LIVRO book) {

FILE *fp;

if((fp=fopen("livros.dat","wb"))==NULL) {
	printf("\n\n\tERRO na abertura do ficheiro");
	return (-1);
}

fwrite(&book,sizeof(LIVRO),1,fp);

fclose(fp);
getchar();
return (1);
}

int lerLivroFicheiro() {

FILE *fp;
int i=0;
LIVRO n_livros[1];

   /* leitura dos alunos */
   puts("\n\n\n\n\n\n\tFICHEIROS --> Carregar dados");
   if((fp=fopen("livros.dat","a+b"))==NULL)
      {
       printf("\n\n\tImpossà vel abrir o ficheiro %s\n", "livro.dat");
       exit(1);
       }
   while(fread(&n_livros[i], sizeof(LIVRO),1,fp)!=0)
      i++;
  
   fclose(fp);

   printf("\n\tForam lidos %d livros com sucesso!\n",i);
printf("\t\t%d\n", n_livros[i].ano_pub);
   getchar();
printf("Pressione a tecla <ENTER> para continuar...");
  getchar();
}

void receberLivroTeclado(){

      LIVRO liv;

printf("Insira o numero ISBN: ");
      scanf("%s", &liv.isbn);
      printf("Insira o titulo: ");
      scanf("%s", &liv.titulo);
      printf("Insira o idioma: ");
      scanf("%s", &liv.idioma);
      printf("Insira o autor: ");
      scanf("%s", &liv.autor);
      printf("Insira a editora: ");
      scanf("%s", &liv.editora);
      printf("Insira o ano de publicação: ");
      scanf("%d", &liv.ano_pub);
      printf("Insira o preço: ");
      scanf("%f", &liv.preco);
      printf("Insira o número total de páginas: ");
      scanf("%d", &liv.total_pag);
      printf("Insira a area cientifica: ");
      scanf("%s", &liv.area_cient);

      //printf("Quantidade de livros em stock: %d",);

if(gravarLivroFicheiro(liv) == -1)
	puts("Não foi possà vel guardar os dados no ficheiro");

getchar();
getchar();

}
Posted

Devias ter incluído a definição da estrutura LIVRO e a função main.

De qualquer forma tens aí alguns problemas na função lerLivroFicheiro:

- devias receber um apontador para LIVRO, em vez de declarares uma variável desse tipo dentro da função, de modo a conseguires passar o livro lido a quem chamou a função;

- poderás também receber um apontador para FILE já aberto, de modo a conseguires ler registos após o primeiro;

- declaras um array com uma posição, e tentas ler tantos livros quantos existam no ficheiro. Se existir mais que um livro no ficheiro, a função vai escrever onde não deve, e o programa estoira. Se seguires a recomendação anterior e leres só um livro do ficheiro, o problema fica resolvido;

- estás a abrir o ficheiro em modo de leitura e escrita, considera mudar o modo de abertura para "rb"

- se tudo correr bem na função, não estás a devolver nenhum valor, poderás devolver 0 para indicar que correu tudo bem.

Desaparecido.

Posted

A questão do vector só ter uma posição era mesmo só pra testar se conseguíamos ler a estrutura que pusemos no ficheiro.. Tipo, ainda estamos numa fase "embrionária" do projecto e na main() só temos uma função a chamar outra menuPrincipal(); e é partir daqui que "tudo" se desenrola.. onde são chamados os submenus e assim.. é má prática?

Posted

Não é que seja má prática, é só mesmo porque tive que adivinhar como foram chamadas as coisas 😄

Outra questão é que a função chama-se lerLivroFicheiro, faz sentido que só leia uma estrutura.

O problema é qual a estrutura a ler, e nesse sentido ou passas o apontador para o ficheiro, e a função lê o próximo livro, ou passas um número de índice, e a função lê esse índice a partir do ficheiro.

Ou podes ler todas as estruturas do ficheiro, embora isto, para ser bem feito, requeira alocação dinâmica de memória (e um outro nome para a função :😄 ).

Desaparecido.

Posted

Ummm.. O objectivo acho que seria ler todos os "atributos" (JAVA lool) de um determinado livro a partir de um atributo identificativo deste, por exemplo, o ISBN, e depois imprimi-los ao utilizador quando este seleccionasse a opção "Consultar livro" no menu Livros..

typedef struct {
        char *isbn;
        char *titulo;
        char *idioma;
        char *autor;
        char *editora;
        int ano_pub;
        float preco;
        int total_pag;
        char *area_cient;
        unsigned int stock ;
        char *data_venda;
} LIVRO;
  • Solution
Posted

Ah... lá está... da maneira que tens a estrutura definida não podes utilizar as funções fwrite e fread dessa maneira. Tens que arranjar maneira de serializar a estrutura, e depois escrevê-la para o ficheiro.

Ou então podes alterar a estrutura e utilizar arrays de char em vez de apontadores para char, o que simplifica muito o processo de escrita e leitura.

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.