• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jpdoliveira

Ajuda! Ler informaçao de ficheiro para colocar posteriormente em vector!

2 mensagens neste tópico

O meu problema é o seguinte:

Tenho informação num ficheiro texto tipo:

(Nome                          preço posiçao data de validade)

"Chocolate Crunch"      1.0 (9,9,5) 30/4/2009

"Agua"                  0.5 (5,5,0) 15/12/2009

"Agua"                  0.5 (5,5,1) 15/12/2009

"Agua"                  0.5 (5,5,2) 15/12/2009

"Agua"                  0.5 (5,5,3) 15/12/2009

"Coca Cola Light"          1.0 (0,1,0) 15/12/2010

E queria carregar estas informações de modo a posteriormente colocar num vector que exemplificasse uma daquelas maquinas de "snacks".

Pensei em ler primeiro o ficheiro e colocar as informaçoes em estruturas e depois partir dai, mas não estou a ver como se faz.

Se puderem ajudar, agradecia!

ass: joão oliveira

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <stdio.h>

int main(void) {
  char line[800];
  while (fgets(line, sizeof line, stdin) != NULL) {
    char v1[30];
    double v2;
    char v3[30];
    int v4, v5, v6;

    /* EDIT:
    if (sscanf(line, "\"%30[^\"]\"%lf(%30[^)]) %d/%d/%d", v1, &v2, v3, &v4, &v5, &v6) == 6) {
    Acrescentei um espaço antes do parentesis */
    if (sscanf(line, "\"%30[^\"]\"%lf (%30[^)]) %d/%d/%d", v1, &v2, v3, &v4, &v5, &v6) == 6) {
      /* ok */
    } else {
      /* error */
    }
  }
  return 0;
}

Não testado

fgets --> http://www.opengroup.org/onlinepubs/007908799/xsh/fgets.html

sscanf --> http://www.opengroup.org/onlinepubs/007908799/xsh/sscanf.html

Edit

Format string do sscanf: "\"%30[^\"]\"%lf (%30[^)]) %d/%d/%d"

\" ==> lê e ignora umas aspas

%30[^\"] ==> lê um máximo de 30 caracteres diferentes de aspas para a primeira variável

\" ==> lê e ignora umas aspas

%lf ==> lê um valor com decimais para a segunda variável, do tipo double

(espaço) ==> lê e ignora espaços (bug antes de editar)

( ==> lê e ignora um '('

%30[^)] ==> lê um máximo de 30 caracteres diferentes de ')'

(espaço) ==> lê e ignora espaços (desnecessário; o %d seguinte já faz isto)

%d ==> lê um inteiro

/ ==> lê e ignora um '/'

...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora