mrbean Posted June 22, 2012 at 03:28 PM Report Share #464970 Posted June 22, 2012 at 03:28 PM Boa Tarde pessoal, Tenho em mãos um trabalho que consiste em carregar de um ficheiro de texto dados para uma lista. O objectivo é dividir a string e depois fazê-la atribuir aos diferentes tipos da lista. Exemplo: 1;José;Barreiro; Fazer com que "1" seja atribuído a identificação na lista, "José" atribuído a nome na lista,"Barreiro" atribuído a morada na lista. E depois é só mostrar no ecrã da lista os respectivos tipos da lista... É esta a maneira mais fácil de o fazer? Desde já agradeço a todos a disponibilidade que oferecem neste fórum. Cumprimentos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 22, 2012 at 03:31 PM Report Share #464973 Posted June 22, 2012 at 03:31 PM le a linha com fgets, depois "separa" os elementos com strtok e guarda-os depois nos elementos da tua lista 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
mrbean Posted June 22, 2012 at 03:56 PM Author Report Share #464978 Posted June 22, 2012 at 03:56 PM (edited) Não posso por exemplo fazer isto? void mostra_ficheiro(char *nome_ficheiro){ fornecedores_s forn; char *token = NULL; char linha; strcpy(linha,nome_ficheiro); token= strtok(frase, ";"); while(token) { printf("%s \n",token); token =strtok( NULL, ";"); } } Edited June 22, 2012 at 04:06 PM by mrbean Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 22, 2012 at 04:01 PM Report Share #464980 Posted June 22, 2012 at 04:01 PM 1º- não estás a ler o ficheiro, estás a manipular o nome/caminho do ficheiro 2º- a primeira chamada de strtok é sobre uma variável que não existe 3º- não estás a guardar o resultado em lado nenhum, estás a imprimir na consola 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
mrbean Posted June 22, 2012 at 05:38 PM Author Report Share #464999 Posted June 22, 2012 at 05:38 PM (edited) Tens toda a razão, por vezes distraimo-nos e é um problema... void mostra_ficheiro(char *nome_ficheiro){ fornecedores_s forn; char *token = NULL; char linha[200]; fgets(linha,200,f); token= strtok(linha, ";"); while(token) { printf("%s \n",token); token =strtok( NULL, ";"); } } Assim já consigo mostrar uma linha na consola, só ainda não consegui meter a ler todas as linhas do ficheiro a apresentá-las na consola e a guardar o resultado na lista... 😕 Edited June 22, 2012 at 05:38 PM by mrbean Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 22, 2012 at 05:44 PM Report Share #465004 Posted June 22, 2012 at 05:44 PM só estás a fazer um fgets ... tens de fazer um ciclo até que o fgets falhe 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
KiNgPiTo Posted June 22, 2012 at 06:28 PM Report Share #465016 Posted June 22, 2012 at 06:28 PM (edited) Tinha este parser generalista guardado que fiz quando andava a aprender isto, mudava-lhe agora umas coisas mas para tirares umas ideias (ou usares se te der jeito): #include <stdio.h> #include <string.h> #define MAX 100 /* @author José Ribeiro(KingPito) */ /** Utilizaçao com numero de campos(colunas) fixos. Por seguranca o valor de colunas passado é o menor encontrado @param nomeFicheiro nome do ficheiro a ler @param delim String que faz a separação (token) @param linhas apontador onde será devolvido o numero de linhas que foi lido @param colunas apontador onde será devolvido o menor numero de colunas lido @return lista de listas de strings em que em cada lista contem todas as colunas (campos lidos de uma dada linha */ char ***parser(char *nomeFicheiro, char *delim, int *linhas, int *colunas){ FILE *f = fopen(nomeFicheiro, "r"); char ***lista=NULL, *ptr, *straux; char str[MAX]; int i=0, j=0, min=9999999; while(fgets(str, MAX, f)){ // Fix para caso o \n apareça no fim de str straux = strchr(str, '\n'); if (straux) *straux = '\0'; ptr = strtok(str, delim); lista = (char ***)realloc(lista, (i+1)*sizeof(char **)); lista[i] = (char **)malloc(sizeof(char *)); while(ptr){ lista[i][j] = strdup(ptr); j++; ptr = strtok(NULL, delim); } i++; min = j<min ? j : min; j=0; } fclose(f); *linhas = i; *colunas = min; return lista; } int main(int argc, char **argv){ int nlinhas,ncolunas,i,j; char ***l = parser("lol.txt", ";", &nlinhas, &ncolunas); for(i=0; i<nlinhas; i++){ for(j=0; j<ncolunas; j++){ printf("Linha %d Coluna %d: %s\n", i, j, l[i][j]); } } return 1; } Edited June 22, 2012 at 06:30 PM by KiNgPiTo 1 Report Link to comment Share on other sites More sharing options...
Dr_Lion Posted June 23, 2012 at 12:17 AM Report Share #465070 Posted June 23, 2012 at 12:17 AM Tens toda a razão, por vezes distraimo-nos e é um problema... void mostra_ficheiro(char *nome_ficheiro){ fornecedores_s forn; char *token = NULL; char linha[200]; fgets(linha,200,f); token= strtok(linha, ";"); while(token) { printf("%s \n",token); token =strtok( NULL, ";"); } } Assim já consigo mostrar uma linha na consola, só ainda não consegui meter a ler todas as linhas do ficheiro a apresentá-las na consola e a guardar o resultado na lista... 😕 Creio que te falta aí a linha que te abre o ficheiro e apontas o f para o ficheiro aberto com a funçao "fopen" á qual passas o nome do ficheiro. Link to comment Share on other sites More sharing options...
mrbean Posted June 23, 2012 at 02:51 PM Author Report Share #465119 Posted June 23, 2012 at 02:51 PM eu tenho uma função que abre o ficheiro e que é chamada antes de chamar esta função. e tenho FILE *f como variável global Tinha este parser generalista guardado que fiz quando andava a aprender isto, mudava-lhe agora umas coisas mas para tirares umas ideias (ou usares se te der jeito): #include <stdio.h> #include <string.h> #define MAX 100 /* @author José Ribeiro(KingPito) */ /** Utilizaçao com numero de campos(colunas) fixos. Por seguranca o valor de colunas passado é o menor encontrado @param nomeFicheiro nome do ficheiro a ler @param delim String que faz a separação (token) @param linhas apontador onde será devolvido o numero de linhas que foi lido @param colunas apontador onde será devolvido o menor numero de colunas lido @return lista de listas de strings em que em cada lista contem todas as colunas (campos lidos de uma dada linha */ char ***parser(char *nomeFicheiro, char *delim, int *linhas, int *colunas){ FILE *f = fopen(nomeFicheiro, "r"); char ***lista=NULL, *ptr, *straux; char str[MAX]; int i=0, j=0, min=9999999; while(fgets(str, MAX, f)){ // Fix para caso o \n apareça no fim de str straux = strchr(str, '\n'); if (straux) *straux = '\0'; ptr = strtok(str, delim); lista = (char ***)realloc(lista, (i+1)*sizeof(char **)); lista[i] = (char **)malloc(sizeof(char *)); while(ptr){ lista[i][j] = strdup(ptr); j++; ptr = strtok(NULL, delim); } i++; min = j<min ? j : min; j=0; } fclose(f); *linhas = i; *colunas = min; return lista; } int main(int argc, char **argv){ int nlinhas,ncolunas,i,j; char ***l = parser("lol.txt", ";", &nlinhas, &ncolunas); for(i=0; i<nlinhas; i++){ for(j=0; j<ncolunas; j++){ printf("Linha %d Coluna %d: %s\n", i, j, l[i][j]); } } return 1; } Acho que não me dá muito jeito, mas de qualquer das maneiras, muito obrigado por teres postado ! 🙂 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 23, 2012 at 03:06 PM Report Share #465121 Posted June 23, 2012 at 03:06 PM só estás a fazer um fgets ... tens de fazer um ciclo até que o fgets falhe IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
mrbean Posted June 23, 2012 at 03:12 PM Author Report Share #465122 Posted June 23, 2012 at 03:12 PM (edited) isso já solucionei, obrigado HappyHippyHippo 😉 Só falta a passagem para a lista daquilo que leio, para depois por exemplo se quiser alterar algum dos dados apresentados, o fazer... Edited June 23, 2012 at 03:13 PM by mrbean Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 23, 2012 at 03:27 PM Report Share #465124 Posted June 23, 2012 at 03:27 PM então força 1 Report 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