Andre1989 Posted May 22, 2013 at 06:52 PM Report #508391 Posted May 22, 2013 at 06:52 PM (edited) Boa tarde, Sou novo por aqui e gostaria de uma ajudinha se fosse possível estou com um problema na escrita de uma estrutura de dados num ficheiro. O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços. void SalvarFicheiro(){ //funçao para guardar os dados FILE *f; int i; f=fopen(nomeficheiro,"wb"); //abre ficheiro onde sera guardada a estrutura for(i=0;i<livro;i++) fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f); flag = 1; system("PAUSE"); system("cls"); if(flag == 1) printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro); else printf("Nao existem ficheiros actualmente abertos!\n\n"); Menu(); } //-------------------------------ESTRUTURA DOS LIVROS----------------------------------// typedef struct{ char ISBN[50]; char Titulo[50]; char Idioma[50]; char Autor[50]; char Editora[50]; char AnoDePublicacao[4]; char Preco[50]; char NumeroPaginas[5000]; char Quantidade[5000]; } LIVRO; LIVRO biblioteca[numerolivros]; int livro = 0; Cumprimentos, Edited May 22, 2013 at 07:06 PM by pmg GeSHi
pmg Posted May 22, 2013 at 07:11 PM Report #508396 Posted May 22, 2013 at 07:11 PM (edited) O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços. for(i=0;i<livro;i++) fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f); Este loop com o fwrite vai escrever varias vezes a biblioteca completa. Cada ciclo escreve uma biblioteca completa. Edited May 22, 2013 at 07:15 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Andre1989 Posted May 22, 2013 at 07:40 PM Author Report #508398 Posted May 22, 2013 at 07:40 PM Sim e sem o FOR, o resultado era o mesmo! :S Ja tentei escrever os dados do ficheiro na consola e dá o mesmo problema
pmg Posted May 22, 2013 at 07:58 PM Report #508401 Posted May 22, 2013 at 07:58 PM //-------------------------------ESTRUTURA DOS LIVROS----------------------------------// typedef struct{ char ISBN[50]; char Titulo[50]; char Idioma[50]; char Autor[50]; char Editora[50]; char AnoDePublicacao[4]; char Preco[50]; char NumeroPaginas[5000]; char Quantidade[5000]; } LIVRO; Xiiiiiiiiiiiiii ... porque 5000 bytes para o numero de paginas, e o mesmo para a quantidade, e 50 bytes para preco??? Nao queres rever esta estrutura? Sugestao //-------------------------------ESTRUTURA DOS LIVROS----------------------------------// typedef struct{ char ISBN[50]; char Titulo[50]; char Idioma[50]; char Autor[50]; char Editora[50]; int AnoDePublicacao; unsigned PrecoCentimos; /* dividir por 100 para preco em Euros */ int NumeroPaginas; int Quantidade; } LIVRO; Sem meteres aqui o codigo que actualiza a biblioteca 'e impossivel saber o que esta mal. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Andre1989 Posted May 22, 2013 at 08:49 PM Author Report #508407 Posted May 22, 2013 at 08:49 PM (edited) Este é o codigo onde eu insiro um novo livro: LIVRO InserirLivro(){ LIVRO novo; if (nomeficheiro[30] == 0){ printf("Para inserir um livro tera de criar/abrir um novo ficheiro!!\n\n"); system("PAUSE"); system("cls"); if(flag == 1) printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro); else printf("Nao existem ficheiros actualmente abertos!\n\n"); Menu(); } else{ printf("\nIntroduza o ISBN do livro: "); fgets(novo.ISBN, 50 , stdin); printf("\nIntroduza o titulo do livro que deseja introduzir: "); fgets(novo.Titulo, 50 , stdin); printf("\nIntroduza o idioma do livro: "); fgets(novo.Idioma, 50 , stdin); printf("\nIndrotuza o nome do autor: "); fgets(novo.Autor, 50 , stdin); printf("\nIntroduza o nome da editora: "); fgets(novo.Editora, 50 , stdin); printf("\nIntroduza o ano de publicacao: "); fgets(novo.AnoDePublicacao, 50 , stdin); printf("\nIntroduza o preco do livro: "); fgets(novo.Preco, 50 , stdin); printf("\nIntroduza o numero total de paginas: "); fgets(novo.NumeroPaginas, 50 , stdin); printf("\nIntroduza a quantidade em stock: "); fgets(novo.Quantidade, 50 , stdin); livro++; printf("\n\nLIVRO INSERIDO NA BASE DE DADOS COM SUCESSO!!\n\n"); return(novo); } } Depois esta função vai ser chamada mais em baixo no menu de ficheiros: void MenuLivros(){ int opc; printf("\n"); printf(" #----------------LIVROS----------------#\n"); printf(" | Inserir ---> Opcao 1 |\n"); printf(" | Remover ---> Opcao 2 |\n"); printf(" | Consultar ---> Opcao 3 |\n"); printf(" | Editar ---> Opcao 4 |\n"); printf(" | Ordenar ---> Opcao 5 |\n"); printf(" | Voltar atras ---> Opcao 6 |\n"); printf(" #--------------------------------------#\n"); printf("\n"); printf("Digite uma das opcoes:"); scanf("%d",&opc); fflush(stdin); switch (opc){ case 1: biblioteca[livro] = InserirLivro(); Mostralivro(biblioteca[livro]); SalvarFicheiro(); system("PAUSE"); system("cls"); if(flag == 1) printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro); else printf("Nao existem ficheiros actualmente abertos!\n\n"); Menu(); break; case 2: break; case 3: MenuConsultas(); break; case 4: break; case 5: break; case 6: system("cls"); if(flag == 1) printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro); else printf("Nao existem ficheiros actualmente abertos!\n\n"); Menu(); break; default: printf("Opcao invalida\n"); } } Em relação a estrutura, sim já melhorei como mencionou 🙂 Edited May 22, 2013 at 09:21 PM by brunoais geshi
pmg Posted May 22, 2013 at 09:28 PM Report #508413 Posted May 22, 2013 at 09:28 PM Aqui, em MenuLivros(), esta uma coisa que eu nao gosto nada, nada, nada!! biblioteca[livro] = InserirLivro(); Repara que a funcao InserirLivro() altera o valor da vraiavel global livro; e usas o valor dessa varaiavel --- antes ou depois da alteracao??? --- para copiar o livro para a biblioteca. Acaba com as variaveis globais! Elas geram mais problemas do que os que 'aparentemente' resolvem. Como eu faria a insercao dum livro sem mudar muito o teu codigo era fazer a funcao InserirLivro() nao precisar de saber o numero do livro e actuzalizar livro na copia /* livro nao 'e variavel global!!! */ biblioteca[livro++] = InserirLivro(); /* InserirLivro nao altera `livro` */ ou biblioteca[livro++] = InserirLivro(); /* InserirLivro nao altera `livro` */ livro++; What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HappyHippyHippo Posted May 23, 2013 at 08:19 AM Report #508456 Posted May 23, 2013 at 08:19 AM estou com um problema na escrita de uma estrutura de dados num ficheiro. O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços. // ... f=fopen(nomeficheiro,"wb"); // ficheiro binário for(i=0;i<livro;i++) fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f); // escrita de valores binários ficheiros binários não são para ser abertos por um editor de texto. apesar de te aparecerem espaços, não quer dizer que não tenham informação !!! da seguinte tabela, diz quantos caracteres existem com valor abaixo de 30 e com representação gráfica de um símbolo ? : http://www.asciitable.com/ IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
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