Neno Posted May 9, 2012 at 08:23 PM Report #454158 Posted May 9, 2012 at 08:23 PM Boas noites pessoal Hoje queria a vossa ajuda para resolver um problema que estou a ter com o tratamento de ficheiros de texto em c. Tenho que fazer um programa que faça o controlo do stock de ingredientes de um restaurante, onde cada ingrediente tem um indicador numérico, quantidade em stock, limite mínimo e consumo médio nos últimos 7 dias. O programa deve permitir a consulta total ou parcial dos ingredientes que estão no ficheiro, entre outras coisas. O acesso a este ficheiro com um editor de texto permite adicionar ou eliminar ingredientes, estas operações não podem ser efectuadas pelo programa. O problema é que não faço a mínima ideia de como posso escrever uma estrutura directamente no ficheiro de texto, sem ser no programa. Já comecei a escrever algum código para ver o que acontece, e neste momento não acontece rigorosamente nada, já esteve a correr mas não mostrava nada, mas agora o programa deixa mesmo de funcionar e nada acontece na mesma... #include<stdio.h> #include <stdlib.h> #define max 100 typedef struct ingrediente{ char nome; int num; float quant; float lim; float media; } I; int le_t(); void mostra_i(I ing); void main() { int total=0; I ing[max]; I *p=&ing[0]; total=le_t(); getchar(); } void mostra_i(I ing) { printf("Nome: %s", ing.nome); printf("Identificador num: %d", ing.num); printf("Em stock: %f", ing.quant); printf("Limite do stock: %f", ing.lim); printf("Media dos ultimos 7 dias: %f", ing.media); } int le_t() { I aux; int total=0; FILE *f; f=fopen("stock.txt", "rt"); if(f==NULL) printf("ERRO LEITURA"); else { while(fread(&aux, sizeof(I),1 , f)==1); { mostra_i(aux); } fclose(f); } return total; } O ficheiro stock.txt está assim: oregaos 1 20 2,5 0,5 Já tentei varias versões e está é a que tenho agora, um colega meu já teve uma muito parecida a correr, mas apanhava a informação todo para o nome do ingrediente.. Podem-me ajudar?
petvetbr Posted May 9, 2012 at 08:35 PM Report #454162 Posted May 9, 2012 at 08:35 PM Existem algumas coisas que você precisa definir primeiro antes de fazer isto. Um dos principais problemas é como representar e delimitar os campos. Se você tentar ler diretamente este arquivo do jeito que está vai ter os seguintes problemas: 1) A quebra de linhas em textos são representados por caracteres especiais geralmente (\n) no Linux/Unix/MacOS e (\r\n) no Windows, então você precisa considerá-los na sua leitura. Caso contrário durante a leitura do arquivo, isto pode ser considerado como dados e resultar em problemas. 2) A representação de números no caso da linguagem C é binária, isto significa que por exemplo quando você tentar ler algo como "2,0" que está no texto, não será entendido como 2,0 numérico e sim os bytes que representam estes 3 caracteres no arquivo. Se você for trabalhar desta forma, deve criar um conversor que faça o serviço de passar da forma binária para textual na hora de gravar e posteriormente faça o caminho contrário na hora de ler este arquivo. Concluindo, não é simplemente pegando a struct e a escrevendo no arquivo ou ler do arquivo para a struct que isto vai funcionar. Você irá ter que criar um sistema de serialização (binário->text) e deserialização (texto->binário) destas estruturas. Fernando Lage Bastos - MCP/MCTS/MCPD
pmg Posted May 9, 2012 at 08:48 PM Report #454166 Posted May 9, 2012 at 08:48 PM (edited) typedef struct ingrediente{ char nome; O nome so tem espaco para 1 caracter. Se fosse para funcionar assim, como distinguias oregaos de ovos? Se fosse eu a fazer e tivesse total liberdade para o formato do ficheiro, metia no ficheiro um artigo por linha. Em cada linha metia as informacoes numericas primeiro e o nome no fim. 1 20 2.5 0.5 oregaos 42 76.5 33 27 ovo 37 5 7 8 oleo (Litro) Para ler o ficheiro usava uma combinacao de fgets() com strtol() ou strtod(). while (fgets(buf, sizeof buf, handle)) { char *err; id = strtol(buf, &err, 10); /* falta error checking */ qtd = strtod(err, &err); /* nestas */ lim = strtod(err, &err); /* conversoes */ avg = strtod(err, &err); /* todas */ strcpy(name, err + 1); } Edited May 14, 2012 at 09:46 AM by pmg GeSHi update 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!
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