Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

WolfmanZ

Ler dados para Lista

Mensagens Recomendadas

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


Ligação para a mensagem
Partilhar noutros sites
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!!!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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, ",");


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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,...


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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 ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
KTachyon

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


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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 ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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...


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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');
     }


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação 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. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.