SkySkull Posted May 13, 2009 at 01:19 PM Report #263811 Posted May 13, 2009 at 01:19 PM 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:
TheDark Posted May 13, 2009 at 07:46 PM Report #263944 Posted May 13, 2009 at 07:46 PM Como estás a fazer? Desaparecido.
SkySkull Posted May 13, 2009 at 11:03 PM Author Report #264007 Posted May 13, 2009 at 11:03 PM 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(); }
TheDark Posted May 14, 2009 at 09:09 AM Report #264041 Posted May 14, 2009 at 09:09 AM 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.
SkySkull Posted May 14, 2009 at 10:59 AM Author Report #264091 Posted May 14, 2009 at 10:59 AM 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?
TheDark Posted May 14, 2009 at 11:17 AM Report #264102 Posted May 14, 2009 at 11:17 AM 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.
SkySkull Posted May 14, 2009 at 12:34 PM Author Report #264119 Posted May 14, 2009 at 12:34 PM 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 TheDark Posted May 14, 2009 at 07:28 PM Solution Report #264220 Posted May 14, 2009 at 07:28 PM 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.
SkySkull Posted May 14, 2009 at 07:35 PM Author Report #264221 Posted May 14, 2009 at 07:35 PM Umm.. mas.. char * não é «exactamente» igual a char[]? o_O'
Triton Posted May 14, 2009 at 08:10 PM Report #264229 Posted May 14, 2009 at 08:10 PM Umm.. mas.. char * não é «exactamente» igual a char[]? o_O' Não. São coisas bem diferentes. http://c-faq.com/aryptr/aryptr2.html <3 life
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now