Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Nascimento

[Resolvido] Erro ao ler dados de ficheiro para estrutura

Recommended Posts

Olá...

 

Não estou a conseguir ler os dados de um ficheiro de texto para um vector de estruturas...

 

Alguem me pode ajudar?

 

Codigo estrutura:

typedef struct dados
{
  char curso[50], nomeuc[50], doc_res[50], area_cientifica[50];
  float t, tp, pl, p, ac, ot, s, turm_t,turm_tp, turm_p, turm_pl, turm_ac, turm_ot, turm_s, docentes;
  int ects, opcional, ano, semestre;
} DADOS;

Codigo Função leitura de dados:

void ler_dados_fich(DADOS *uc, int num)
{
  char cabecalho[1000];
  int i=0;
  FILE *pfdados;

  pfdados=fopen("dados_ucs_070410.txt","r");

  if(pfdados==NULL)
  {
    printf("Erro ao abrir o ficheiro! \n");
    system("pause");
  }

  fscanf(pfdados,"[^\n]\n",cabecalho);
  //printf("%s\n",cabecalho);

  for (i=0;i<num;i++)
    {
    fscanf( pfdados , "[^\t]\t%d\t%d\t%[^\t]\t%d\t%[^\t]\t%d\t%[^\t]\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f",uc[i].curso,&uc[i].ano,&uc[i].semestre,uc[i].nomeuc,&uc[i].ects,uc[i].area_cientifica,&uc[i].opcional,uc[i].doc_res,&uc[i].docentes,&uc[i].turm_t,&uc[i].turm_tp,&uc[i].turm_p,&uc[i].turm_pl,&uc[i].turm_ac,&uc[i].turm_ot,&uc[i].turm_s,&uc[i].t,&uc[i].tp,&uc[i].p,&uc[i].pl,&uc[i].ac,&uc[i].ot,&uc[i].s);
  }
  fclose(pfdados);
}

Codigo completo: [anchorlink='http://www.pastie.org/959481']http://www.pastie.org/959481[/anchorlink]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi,

Você quer ler um dado de um arquivo e jogar na estrutura,

Se for isso:

 

#include <stdio.h>

struct Dados
{
    char curso[50];
};

int main()
{
    Dados dados;
    FILE *arquivo;

    if( (arquivo = fopen("arquivo.txt", "r")) == NULL)
    {
        printf("Erro");
    }

    fgets(dados.curso, sizeof(dados.curso), arquivo);

    printf("%s", dados.curso);

    return(0);
}

O fgets pega somente uma linha por vez.

 

Caso queira ler várias linhas:

 

struct Dados
{
    char curso[5][80];
};

int main()
{
    Dados dados;
    FILE *arquivo;
    int i=0;

    if( (arquivo = fopen("arquivo.txt", "r")) == NULL)
    {
        printf("Erro");
    }

    while(!feof(arquivo))
    {
        fgets(dados.curso[i], sizeof(dados.curso[i]), arquivo);
        i++;
    }

    for(i=0; i<5; i++)
    {
        printf("%s", dados.curso[i]);
    }

    return(0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E se nessas linhas ouver varias variaveis de varios tipo diferentes?

 

Como no exemplo...

 

fscanf( pfdados , "[^\t]\t%d\t%d\t%[^\t]\t%d\t%[^\t]\t%d\t%[^\t]\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f",&uc[i].curso, &uc[i].ano, &uc[i].semestre, &uc[i].nomeuc, &uc[i].ects, &uc[i].area_cientifica, &uc[i].opcional, &uc[i].doc_res, &uc[i].docentes, &uc[i].turm_t, &uc[i].turm_tp, &uc[i].turm_p, &uc[i].turm_pl, &uc[i].turm_ac, &uc[i].turm_ot, &uc[i].turm_s, &uc[i].t, &uc[i].tp, &uc[i].p, &uc[i].pl, &uc[i].ac, &uc[i].ot, &uc[i].s);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia tratar todos os dados como string,

Você pode usar o fscanf como está usando.

 

Na minha opinião, a vantagem de tratar todos os dados como String é que você não tem que criar excessões e nem saber que tipo de dados vai ler.

Quando precisar fazer operações de números, basta converter de:

string pra int usando a função atoi(),

string pra float usando a função atof(),

string pra double usando a função strtod().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia tratar todos os dados como string,

Você pode usar o fscanf como está usando.

 

Na minha opinião, a vantagem de tratar todos os dados como String é que você não tem que criar excessões e nem saber que tipo de dados vai ler.

Quando precisar fazer operações de números, basta converter de:

string pra int usando a função atoi(),

string pra float usando a função atof(),

string pra double usando a função strtod().

 

Pois mas no protocolo esta definido que tem de ser lido tipo a tipo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo,

 

Tem um livro chamado C Completo e total, tava lendo ele agora e achei 3 páginas perfeitas pra você.

Postei o livro completo neste link: http://www.megaupload.com/?d=TIKAJHMR

Peço que baixe e vá até a pagina do livro (não do leitor de e-book) 235, cápitulo 9 E/S com arquivo, leia o tópico sobre fread() e fwrite(),

Tenho certeza que cairá como uma luva para você.

 

Bons Estudos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo,

 

Tem um livro chamado C Completo e total, tava lendo ele agora e achei 3 páginas perfeitas pra você.

Postei o livro completo neste link: http://www.megaupload.com/?d=TIKAJHMR

Peço que baixe e vá até a pagina do livro (não do leitor de e-book) 235, cápitulo 9 E/S com arquivo, leia o tópico sobre fread() e fwrite(),

Tenho certeza que cairá como uma luva para você.

 

Bons Estudos.

 

Ok obrigado vou dar uma vista de olhos já!

 

Pessoal consegui resolver o erro......

 

O problema agora é tenho um cabeçalho no ficheiro que quero ler... Como faço para não ler aquele cabeçalho? Ou seja, ignorar a primeira linha do ficheiro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.