Capturar dados de arquivo

1. Capturar dados de arquivo

Ananda
ananda1990

(usa Ubuntu)

Enviado em 24/10/2015 - 00:29h

Preciso ler um arquivo em que cada linha é do tipo:
1444771699,Ana Maria,SAQUE,-500.00,,200

Note que no penúltimo item não há nada. Ali pode ou estar dessa forma, com dois caracteres separadores (virgulas) juntos ou ter um float.
Como faço para poder capturar esses dados e armazenar em variáveis de forma efetiva? Já que há esse caso que pode ou ter nada entre dois separadores ou ter um float.
Na captura do segundo item (ANA MARIA) também não encontrei uma boa forma de fazer. Gostaria de usar o fscanf, porém só pega até o primeiro espaço e se forçar com o [^,] passa a dar erro nos demais itens que vem depois.
Segue trecho do me código, que só funciona no caso de ter um float e não se estiver vazio:

struct usada:


typedef struct{
int chegada;
char *nome;
char *tTransacao;
double brl;
double usd;
int tOperacao;
}tCliente;



trecho do codigo:

char buffer[MAX_LINHA];

fEntrada = fopen(entrada, "r");

if(!fEntrada){
printf("Erro na abertura do arquivo de entrada.\n");
return;
}

vClientes = (tCliente*)malloc(sizeof(tCliente));

fgets(buffer, MAX_LINHA, fEntrada);
printf("%s\n", buffer);

vClientes->chegada = atoi(strtok(buffer, ","));
vClientes->nome = strtok(NULL, ",");
vClientes->tTransacao = strtok(NULL, ",");
vClientes->brl = atof(strtok(NULL, ","));
vClientes->usd = atof(strtok(NULL, ","));
vClientes->tOperacao = atoi(strtok(NULL, ", \n"));



  


2. Re: Capturar dados de arquivo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/10/2015 - 01:17h

Os campos nome e tTransacao na sua estrutura são ponteiros. Tem certeza de que é isso mesmo que você quer? Você tem de ter cuidado para que, se eles apontarem para áreas alocadas por outras instâncias, essa áreas não sejam alteradas: no código que você postou, ambos vão apontar para o interior de um buffer que é modificado a cada linha linha lida, o que implica que a leitura da próxima linha pode comprometer a informação da linha atual e de todas as que vieram antes dela. Talvez seja interessante trocar os ponteiros por arrays de caracteres, ou providenciar alocação de memória específica para eles ao lhes atribuir dados.

strtok() não lida bem com campos vazios. Se o seu programa for voltado para o mundo UNIX, você pode ver se strsep() lhe atende melhor.

Não vejo razão para você ter problema com o formatador "%[^,]" em fscanf()/sscanf(). Talvez você não esteja sabendo usá-lo. Lembrou-se de colocar o caráter "," na string de formatação, depois da especificação da conversão?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts