• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SkySkull

Memoria dinamica + estruturas + ficheiros (II)

10 mensagens neste tópico

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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();

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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 ::D ).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Umm.. mas.. char * não é «exactamente» igual a char[]? o_O'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora