Jump to content

Recuperar dados para uma estrutura


_neiah__

Recommended Posts

Bom dia.

Estou a tentar recuperar os dados de um ficheiro de texto para uma estrutura, mas não entendo muito sobre ficheiros de texto e provavelmente o meu código está completamente errado...

Será que alguém me pode dar uma ajudinha pf?

typedef struct ingrediente no, *pno;
struct ingrediente{
 char nome[sT_TAM];	 // Nome do ingrediente
int id_i;	 //Identificação do ingrediente
int quant; //quantidade do ingrediente
int limite_med; //Limite médio do ingrediente
int consumo_med; //Consumo Médio
 pno prox;			 // Ponteiro para proximo no da lista
};
pno recupera_lista(pno p, char *listaIngredientes){
pno novo, aux;
aux=p;
pno lista=NULL;
char st[100];
FILE *f;

f=fopen("listaIngredientes.txt", "r");
if (f == NULL)
printf("Erroa abrir o ficheiro!");
else
{
while (fscanf(f, " %[^\n] %d %d %d %d ", novo->nome, &novo->id_i, &novo->quant, &novo->limite_med, &novo->consumo_med) != EOF )
 {
lista = lista->prox;
 }
 fclose (f);
}
return lista;
}

O que estou a fazer de mal? E como é que tenho que fazer ?

Link to comment
Share on other sites

olha para a tua linha no fscanf:

fcanf(f, " %[^\n] %d %d %d %d ", ...);

estás a dizer para ignorar tudo até aparecer um caracter '\n' e depois esperas 4 inteiros

isso não deveria ser ao contrário ??

primeiro ler os 4 inteiros e depois descartar tudo ? e também remover o '\n' final ?? do género

fcanf(f,"%d %d %d %d %*[^\n]\n", ...);

PS : não posso dizer mais por não conhecer a formatação do teu ficheiro de texto

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

olha para a tua linha no fscanf:

fcanf(f, " %[^\n] %d %d %d %d ", ...);

estás a dizer para ignorar tudo até aparecer um caracter '\n' e depois esperas 4 inteiros

isso não deveria ser ao contrário ??

primeiro ler os 4 inteiros e depois descartar tudo ? e também remover o '\n' final ?? do género

fcanf(f,"%d %d %d %d %*[^\n]\n", ...);

PS : não posso dizer mais por não conhecer a formatação do teu ficheiro de texto

void grava_lista(pno lista){

FILE *f;

f = fopen("listaIngredientes.txt", "w");
if(f==NULL)
{
printf("Erro ao criar ficheiro\n");
return;
}
else
{
while(lista != NULL){
fprintf(f, "%s:\n ", lista->nome);
fprintf(f, "%d:\n ", lista->id_i);
fprintf(f, "%d:\n ", lista->quant);
fprintf(f, "%d:\n ", lista->limite_med);
fprintf(f, "%d:\n ", lista->consumo_med);
lista = lista->prox;
}
 fclose(f);
}
}

Isto é o meu código para gravar a lista, agora.

Já alterei como disse-te mas continua sem dar

Link to comment
Share on other sites

como tens uma linha para cada elemento no ficheiro terás de ler tambem uma linha para cada elemento

o que quero dizer é

fprintf(f, "%s:\n ", lista->nome);
fprintf(f, "%d:\n ", lista->id_i);
fprintf(f, "%d:\n ", lista->quant);
fprintf(f, "%d:\n ", lista->limite_med);
fprintf(f, "%d:\n ", lista->consumo_med);

deverás ter algo como

fgets(lista->nome, ST_TAM, f);
fscanf(f, "%d:\n ", &lista->id_i);
fscanf(f, "%d:\n ", &lista->quant);
fscanf(f, "%d:\n ", &lista->limite_med);
fscanf(f, "%d:\n ", &lista->consumo_med);

// o fgets tem a particularidade de ler também o '\n' para o buffer
char * term = strchr(lista->nome, '\n');
term = '\0';
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

pno recupera_lista(char *listaIngredientes){
pno novo, aux;
pno lista=NULL;
FILE *f;

f=fopen("listaIngredientes.txt", "r");
if (f == NULL)
printf("Erroa abrir o ficheiro!");
else
{
while (fscanf(f, "%s %d %d %d %d %[^\n]", novo->nome, &novo->id_i, &novo->quant, &novo->limite_med, &novo->consumo_med) != EOF ){

 fgets(lista->nome, ST_TAM, f);
fscanf(f, "%d:\n ", &lista->id_i);
fscanf(f, "%d:\n ", &lista->quant);
fscanf(f, "%d:\n ", &lista->limite_med);
fscanf(f, "%d:\n ", &lista->consumo_med);
char *term = strchr(lista->nome, '\n');
term = '\0';
lista = lista->prox;
 }
 fclose (f);
}
return lista;
}

já modifiquei o código, mas há uma coisa que não entendi ( peço desculpa pela burrice) e também está a dar erro, é esta linha de código:

char * term = strchr(lista->nome, '\n');
term = '\0';
Link to comment
Share on other sites

vi agora que o código também está errado 😄

char * term = strchr(lista->nome, '\n');
*term = '\0';

o que acontece é que tens no ficheiro a seguinte informação:

nome de ingrediente:\n
123:\n
456:\n
789:\n
369:\n

enquanto que no fscanf podes simplesmente ler o que pretendes, o fgets lerá sempre a linha por completo. no caso do nome será:

: nome de ingrediente:\n

o que se pretende é alterar o '\n' por '\0' que é o caracter de terminação da string

o strchr retorna um ponteiro para o carater encontrado e pretendesse alterar o valor apontado para o caracter '\0' em questão

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Só agora é que vi que estava a faltar umas coisas na função grava lista:

void grava_lista(pno lista){

FILE *f;

f = fopen("listaIngredientes.txt", "w");
if(f==NULL)
{
printf("Erro ao criar ficheiro\n");
return;
}
else
{
while(lista != NULL){
fprintf(f, "Nome:%s\n ", lista->nome);
fprintf(f, "Id.Ingrediente:%d\n ", lista->id_i);
fprintf(f, "Quantidade:%d\n ", lista->quant);
fprintf(f, "Limite Medio:%d\n ", lista->limite_med);
fprintf(f, "Consumo Medio:%d\n ", lista->consumo_med);
lista = lista->prox;
}
 fclose(f);
}
}

Modifiquei novamente o código da função recupera lista, mas tive de comentar as duas linhas de código, porque mesmo depois de ter mudado para

*term = '\0';

continuava a dar erro.

Mas continua sem conseguir recuperar a lista. 😕😞

pno recupera_lista(char *listaIngredientes){
pno novo=NULL;
pno lista=NULL;
FILE *f;

f=fopen("listaIngredientes.txt", "r");
if (f == NULL)
printf("Erroa abrir o ficheiro!");
else
{
while (fscanf(f, "%s %d %d %d %d %[^\n]", novo->nome, &novo->id_i, &novo->quant, &novo->limite_med, &novo->consumo_med) != EOF ){

 fgets(lista->nome, ST_TAM, f);
fscanf(f, "%d\n ", &lista->id_i);
fscanf(f, "%d\n ", &lista->quant);
fscanf(f, "%d\n ", &lista->limite_med);
fscanf(f, "%d\n ", &lista->consumo_med);
//char * term = strchr(lista->nome, '\n');
//*term = '\0';
lista = lista->prox;
 }
 fclose (f);
}
return lista;
}
Link to comment
Share on other sites

pno recupera_lista(char *listaIngredientes){

pno novo=NULL;
char st[100];
FILE *f;

f=fopen("listaIngredientes.txt", "r");
if (f == NULL)
printf("Erro ao abrir o ficheiro!");
else
{
while ( feof (f) ){
 fgets(novo->nome, ST_TAM, f);
fscanf(f, ":%d\n ", &novo->id_i);
fscanf(f, ":%d\n ", &novo->quant);
fscanf(f, ":%d\n ", &novo->limite_med);
fscanf(f, ":%d\n ", &novo->consumo_med);

novo = novo->prox;
}
 }
 fclose (f);
return novo;
}

Coloquei assim para percorrer até ao final do ficheiro, mas algo me diz que também nao está correcto porque nao está a funcionar.

Peço desculpa de estar a chatear, mas preciso mesmo de aprender a fazer isto e nao tenho mais ninguém a quem pedir para tirar as minhas duvidas.. 😕

Link to comment
Share on other sites

o teu problema é que o feof só te retorna verdadeiro quando uma leitura já deu esse erro

tens de passar o fgets para a validação do while

segundo, o ponteiro novo aponta para nada ... logo vai dar erro imediatamente quando tentares guardar para ai

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Olá novamente..

Já alterei o código mas ao correr o programa, mostra um erro a dizer que o ponteiro "novo" nao foi inicializado, mas eu nao sei para onde o devo de meter a apontar..

void recupera_lista(char *n1){

 FILE *f;
 pno novo;
 f=fopen("listaIngredientes.txt", "r");
 if (f == NULL)
   printf("Erro ao abrir o ficheiro!");
 else
 {
   while ( fgets(novo->nome, ST_TAM, f) ){
     fscanf(f, ":%d\n ", &novo->id_i);
     fscanf(f, ":%d\n ", &novo->quant);
     fscanf(f, ":%d\n ", &novo->limite_med);
     fscanf(f, ":%d\n ", &novo->consumo_med);

     novo = novo->prox;
   }
 }
 fclose (f);
}
Link to comment
Share on other sites

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.