Jump to content

Ficheiros de texto e estruturas


Recommended Posts

Posted

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?

Posted

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

Posted (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 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!

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.