_neiah__ Posted June 22, 2012 at 09:58 AM Report Share #464886 Posted June 22, 2012 at 09:58 AM 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 More sharing options...
HappyHippyHippo Posted June 22, 2012 at 10:02 AM Report Share #464887 Posted June 22, 2012 at 10:02 AM (edited) 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 June 22, 2012 at 10:03 AM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 22, 2012 at 10:16 AM Author Report Share #464890 Posted June 22, 2012 at 10:16 AM 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 More sharing options...
HappyHippyHippo Posted June 22, 2012 at 10:22 AM Report Share #464895 Posted June 22, 2012 at 10:22 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 22, 2012 at 11:21 AM Author Report Share #464917 Posted June 22, 2012 at 11:21 AM 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 More sharing options...
HappyHippyHippo Posted June 22, 2012 at 11:29 AM Report Share #464922 Posted June 22, 2012 at 11:29 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 22, 2012 at 12:18 PM Author Report Share #464936 Posted June 22, 2012 at 12:18 PM 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 More sharing options...
HappyHippyHippo Posted June 22, 2012 at 01:23 PM Report Share #464949 Posted June 22, 2012 at 01:23 PM isso porque a condição do while não tem sentido !!! vê bem o que estás a fazer ... a solução é directa agora que tens os vários fscanf's e o fgets IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 22, 2012 at 03:28 PM Author Report Share #464971 Posted June 22, 2012 at 03:28 PM sim, tens razão mas eu tenho de lá meter o while na mesma para ele percorrer tudo até ao fim do ficheiro não é? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 22, 2012 at 03:30 PM Report Share #464972 Posted June 22, 2012 at 03:30 PM sim tens de ter ... mas a condição de paragem não pode ser essa !!! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 22, 2012 at 04:32 PM Author Report Share #464988 Posted June 22, 2012 at 04:32 PM 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 More sharing options...
HappyHippyHippo Posted June 22, 2012 at 04:37 PM Report Share #464989 Posted June 22, 2012 at 04:37 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
_neiah__ Posted June 23, 2012 at 06:05 PM Author Report Share #465143 Posted June 23, 2012 at 06:05 PM 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 More sharing options...
HappyHippyHippo Posted June 23, 2012 at 06:26 PM Report Share #465146 Posted June 23, 2012 at 06:26 PM segundo, o ponteiro novo aponta para nada ... logo vai dar erro imediatamente quando tentares guardar para ai então e eu não tinha já dito isso ??? o que tens de fazer é guardar na tua lista IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
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