Jump to content

Parse String


mrbean
 Share

Recommended Posts

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

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 by mrbean
Link to comment
Share on other sites

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 by mrbean
Link to comment
Share on other sites

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 by KiNgPiTo
  • Vote 1
Link to comment
Share on other sites

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

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

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 by mrbean
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
 Share

×
×
  • 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.