Ir ao conteúdo
  • Cadastre-se

Armazenar cada parte de strtok em uma variável


Posts recomendados

Quero ler várias strings de um arquivo e separá-las utilizando strtok e em seguida, armazenar cada parte em uma variável ou vetor. Porém, não consigo armazenar cada parte recebida de strtok num vetor.
Grato!

Codigo exemplo.
 

#include <stdio.h>#include <string.h>#include <stdlib.h>void main(void){  FILE *fp;  char str[128];  char nota[3];  char *word;  if((fp=fopen("dados.txt", "r"))==NULL) {    printf("\nO arquivo nao pode ser aberto.\n");    exit(1);  }  while(!feof(fp)) {    if(fgets(str, 128, fp)) {      word = strtok(str, " ");           printf("%s", word);            while(word != NULL) {        word = strtok('\0', " ");            //word = nota[i];        printf("|%s", word);              }          }  }  fclose(fp);}
Link para o comentário
Compartilhar em outros sites

@Paulo Cesar Roque

 

 

Pelo que parece, você está lendo notas de um arquivo. Se quiser, poderá usar a função strtod() para fazer a leitura de todas as notas separadas por espaço em cada linha lida do arquivo.

 

 

Seja como for, coloque um exemplo do conteúdo do arquivo dados.txt para que a gente tenha uma ideia do formato.

 

 

 

LNW

Link para o comentário
Compartilhar em outros sites

Quero ler palavras e números separados por vírgulas no arquivo. Ler os dados e imprimi-los funciona, porém eu quero armazenar em variáveis para trabalhar com os dados lidos do arquivo.

Exemplo do arquivo dados.txt:

 

AAAAAA, 12.45, 30.41 10.32

BBBBBBBBB, 9.41, 11.10, 30.21

CCCCCCC 10.23, 14.65, 13.14

 

Num primeiro passo do código exemplo, eu tentava ler apenas um número separados por espaço, mas quero ler separados por vírgulas.

Será que seria necessário criar uma estrutura de dados?

Grato!

Link para o comentário
Compartilhar em outros sites

@Paulo Cesar Roque

 

 

Para considerar outros delimitadores, basta inclui-los. Se for necessitar de todas as tuplas armazenadas na memória, poderia lançar mão de uma lista encadeada ou um simples array dinâmico.

 

Se quiser trabalhar apenas com os dados da linha atual, poderia criar um buffer para o nome e um array para as notas:

double notas[3];char nome[80];...if(fgets(str, 128, fp)){    i = 0;    word = strtok(str, " ,\n");    strcpy(nome, word);    ...    while(word != NULL)    {        word = strtok(NULL, " ,\n");        notas[i] = atof(word);        i++;        ...    }

A cada linha lida, você terá o nome em nome e as 3 notas em cada posição do array notas.

 

 

Note que não há qualquer teste de consistência. Considera-se que o arquivo esteja com os dados inseridos corretamente...

 

 

 

Abs.

LNW

Link para o comentário
Compartilhar em outros sites

Obrigado  LNW, o programa é compilado sem erros, porém, ao rodar, aparece uma mensagem de erro do windows dizendo que esse programa parou de funcionar e, pelos testes que fiz, o problema esta nas linhas:

 

strcpy(nome, word);

notas = atof(word);

 

pois, quando ignoro elas o programa roda sem apresentar erros.

 

segue abaixo parte do programa:

 

...

while(!feof(fp)) {    i = 0;    if(fgets(str, 128, fp)) {      word = strtok(str, " ");      strcpy(nome, word);           printf("%s", word);            while(word != NULL) {        word = strtok('\0', " ");            notas[i] = atof(word);      // erro        i++;        printf(" %d", notas[i]);              }          }  }...

Não sei qual seria o problema, grato!

Link para o comentário
Compartilhar em outros sites

Olá @Paulo Cesar Roque,

 

 

Como havia mostrado no exemplo, se você está considerando outros delimitadores, estes deveriam estar inclusos na strtok(); você não considerou isso, daí o erro com a atof(). Dê uma olhada:

#include <stdio.h>#include <string.h>#include <stdlib.h>int main(void){    FILE *fp;    char str[128], nome[100];    double notas[3];    int i;    char *word;    if ((fp = fopen("dados.txt", "r")) == NULL) {        printf("\nO arquivo nao pode ser aberto.\n");        exit(1);    }    while (!feof(fp)) {        if(fgets(str, 128, fp)) {            i = 0;            word = strtok(str, " ,\n");            strcpy(nome, word);            printf("%s", nome);            while(word != NULL) {                word = strtok(NULL, " ,\n");                if (word) {                    notas[i] = atof(word);                    printf("|%.2f", notas[i]);                    i++;                } else                    putchar('\n');            }        }    }    fclose(fp);    return 0;}

O newline incluso é importante pois o fgets apesar de parar a leitura nesse caractere, o considera válido e inclui na string lida.

 

 

 

 

LNW

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!