Ir para o conteúdo
WolfmanZ

Ler dados para Lista

Mensagens Recomendadas

WolfmanZ    1
WolfmanZ

Boas;

tenho uma duvida tenho um ficheiro de onde tenho de ler dados e inserir na lista cada linha tem:

Marca Matricula Modelo Peso(kg)

Opel,00-75-AF,Corsa, 751      //dados nao sao os verdadeiros

como faço para ler a separar os dados e inserir na lista estruturada?

a minha ideia é ler linha a linha ler caracter a caracter e fazer copias de string para a estrutura! Mas sei que a funçao strtok pode separar os dados, nao sei é como depois passo para a estrutura!

Obrigado desde já!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
yoda    139
yoda

Lês o ficheiro linha a linha, e usas o explode() para separar os dados. Estou a supor que todos os dados estão preenchidos para cada linha :

list($marca, $matricula, $modelo, $peso) = explode(',', $list);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Dependendo da definição da estrutura pode ser tão simples quanto strtok()s e strcpy()s

while (fgets()) {
    p = strtok();
    if (p) strcpy(estrutura->marca, p); /* Marca */
    p = strtok();
    if (p) strcpy(estrutura->matricula, p); /* Matricula */
    p = strtok();
    if (p) strcpy(estrutura->modelo, p); /* Modelo */
    p = strtok();
    if (p) strcpy(estrutura->peso, p); /* Peso */
}

Atenção aos NULLs e buffer overflows!!!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Não tou a perceber a p=strtok(); entao assim o strtok não faz nada!

Aquilo é suposto ser pseudo-c :)

Tens que preencher o que falta. No primeiro strtok poes o que foi lido com o fgets e nos outros NULL

strtok(linha, ",");

strtok(NULL, ",");

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
WolfmanZ    1
WolfmanZ

Desculpa so responder agora pgm, mas tive 2 frequencias e deixei o projecto de lado, ok mas reparei agora que no final de cada linha nao esta "\n" e sim "\r" logo o fgets nao trabalha!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Tens outras formas de ler o ficheiro. Aliás, se podes ler o ficheiro completo em runtime, podes mesmo aplicar um duplo strtok(), mas também podes fazer outro tipo de leitura, com formatos especiais num fscanf(), ler char a char com fgetc(), implementar uma função que utilize o fgets() com um determinado limite e junte os segmentos,...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Desculpa so responder agora pgm, mas tive 2 frequencias e deixei o projecto de lado, ok mas reparei agora que no final de cada linha nao esta "\n" e sim "\r" logo o fgets nao trabalha!

O fgets trabalha com ficheiros de texto (mais propriamente com "streams" (fontes? fluxos? caudais?) em modo texto). Em modo texto a biblioteca e responsavel por traduzir o fim de linha especifico do Sistema Operativo onde ela esta instalada por um '\n' ... donde se conclui que tens a tua implementacao (compilador + bibliotecas) mal instaladas.

Se nao estas a usar o stdin, verifica que nao abriste o ficheiro em modo binario ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
WolfmanZ    1
WolfmanZ

Tens outras formas de ler o ficheiro. Aliás, se podes ler o ficheiro completo em runtime, podes mesmo aplicar um duplo strtok(), mas também podes fazer outro tipo de leitura, com formatos especiais num fscanf(), ler char a char com fgetc(), implementar uma função que utilize o fgets() com um determinado limite e junte os segmentos,...

Sim vou usar fgetc() e ler char a char.

O fgets trabalha com ficheiros de texto (mais propriamente com "streams" (fontes? fluxos? caudais?) em modo texto). Em modo texto a biblioteca e responsavel por traduzir o fim de linha especifico do Sistema Operativo onde ela esta instalada por um '\n' ... donde se conclui que tens a tua implementacao (compilador + bibliotecas) mal instaladas.

Se nao estas a usar o stdin, verifica que nao abriste o ficheiro em modo binario ...

O ficheiro é em extensão ".csv"  e no final de cada linha está um "\r" e não "\n" e estou a usar o dev c++ como ide.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
WolfmanZ    1
WolfmanZ

A título de curiosidade, o que é que estás a utilizar para criar o CSV?

o ficheiro ja csv ja está criado e foi fornecido pelo professor da cadeira, nao posso mexer no ficheiro a menos que haja erro e seja comunicado e ele corrija isso!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

o ficheiro ja csv ja está criado e foi fornecido pelo professor da cadeira, nao posso mexer no ficheiro a menos que haja erro e seja comunicado e ele corrija isso!

Aparentemente o teu professor tem um Macintosh de 1980 :)

Abre o ficheiro em modo binario e trata-o caracter-a-caracter ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Acho que o único sistema operativo que utilizava \r como fim de linha era o Mac OS clássico (pré-X), mas acho que algumas versões do Excel para Mac OS X continuam a produzir ficheiros CSV com linhas terminadas com \r, estranhamente...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
WolfmanZ    1
WolfmanZ

Sim o ficheiro foi produzido em excel e quanto ao SO sei que o Laptop é Mac agora o SO não sei


do{
           while(c != EOF){
                   c = fgetc(fp);
                   linha[i++] = c;
                   printf("%s\n",linha);
           }
        }while(c != '\r');
     }

Tenho isto assim para ler os dados o printf so esta para ver se funcionava mas ao fazer printf esta a fazer isto:

ex: no ficheiro

abbacs

dsafda

output: abbacs

            dbbacs

            dsbacs

            dsaacs ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Falta-te terminar a string com o '\0'. Para uma primeira abordagem experimenta assim


do{
           while(c != EOF){
                   c = fgetc(fp);
                   linha[i++] = c;
                   linha[i] = '\0';                 /* terminar string com '\0' */
                   printf("%s\n",linha);
           }
        }while(c != '\r');
     }

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade