Jump to content
joanacs

Problema com fscanf

Recommended Posts

joanacs

Boa noite!
Estou com uma dúvida no meu segundo `fscanf` da parte dos PACIENTES, porque queria guardar a data que aparece no ficheiro de texto (o dia em a->h.d_dia, o mes em a->h.d_mes e o ano em a->h.d_ano), mas está-me a aparecer números aleatórios na consola.
Alguém sabe como me ajudar?

P.S: Na parte dos médicos também era suposto aparecer alguma coisa, mas não consigo achar o erro. Se alguém souber, também agradeço.    

 

Citação

Ficheiro de texto:

Arnaldo Antunes
12-1-1956
2
Normal - 13/08/2016 - Joao Silva
Normal - 17/05/2016 - Joao Silva
Ana Sofia Ramos
23-6-1999
0

struct hora_entrada{int horas, minutos;};

    struct hora_saida{int horas, minutos;};

    typedef struct medico med, *p_med;
    struct medico{
        char nome[ST_TAM];
        char especialidade[ST_TAM];
        struct hora_entrada h_e;
        struct hora_saida h_s;
        p_med prox;
    };

    struct data_nasc{int dia, mes, ano;};

    struct historico{
        char grau[ST_TAM];
        int d_dia;
        int d_mes;
        int d_ano;
        char nome[ST_TAM];
    };

    typedef struct paciente pac, *p_pac;
    struct paciente{
        char nome[ST_TAM];
        struct data_nasc d_n;
        int consultas;
        struct historico h;
        p_pac prox;
        };


    int le_dados (){
    FILE *f, *g;
    med *v;
    pac *a;
    int i;
    f=fopen("medico.txt", "rt");
    g=fopen("paciente.txt", "rt");
    if (f==NULL || g==NULL){
        printf("Erro no acesso ao ficheiro.\n");
        return 0;
    }
    v=malloc(sizeof(med));
    a=malloc(sizeof(pac));
    if (v==NULL || a==NULL){
        printf("Erro na alocaçao de memoria.\n");
        return 0;
    }

    printf("\nMEDICOS\n");
    while (fscanf(f,"%49[^\n] %49s %d:%d-%d:%d",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos )==6 )
            printf("%s %s %d %d %d %d\n",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos);

    printf("\n\nPACIENTES\n");
    while (fscanf(g,"%49[^\n] %d-%d-%d %d",a->nome, &a->d_n.dia, &a->d_n.mes, &a->d_n.ano, &a->consultas)==5)
            printf("Nome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",a->nome, a->d_n.dia, a->d_n.mes, a->d_n.ano, a->consultas);
            for(i=0;i<a->consultas;i++){
                fscanf(g,"%s %d %d %d",a->h.grau, &a->h.d_dia, &a->h.d_mes, &a->h.d_ano);
                printf("\t%s %d/%d/%d",a->h.grau, a->h.d_dia, a->h.d_mes, a->h.d_ano);
            }
    fclose(f);
    }

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

consegues mapear o teu formato do fscanf para todos os caracteres do ficheiro que estás a ler ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
2 horas atrás, HappyHippyHippo disse:

consegues mapear o teu formato do fscanf para todos os caracteres do ficheiro que estás a ler ?

O nome, a data de nascimento, as consultas e o grau estão a funcionar e supostamente a data também aparece, mas no meio de outros números.

Consola:

PACIENTES
Nome: Arnaldo Antunes
Data de nascimento: 12-1-1956
Consultas: 2
        Normal 1868852841/1398567799/1702130553 13/08/2016 1868852841/1398567799/1702130553

Share this post


Link to post
Share on other sites
HappyHippyHippo

não foi isso que pedi.

o que perguntei foi se conseguias mapear o seguinte formato : %49[^\n] %49s %d:%d-%d:%d

e o seguinte formato : %49[^\n] %d-%d-%d %d

a todos (e digo mesmo todos) os caracteres de texto descritos no teu exemplo :

Arnaldo Antunes
12-1-1956
2
Normal - 13/08/2016 - Joao Silva
Normal - 17/05/2016 - Joao Silva
Ana Sofia Ramos
23-6-1999
0


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
Agora, HappyHippyHippo disse:

não foi isso que pedi.

o que perguntei foi se conseguias mapear o seguinte formato : %49[^\n] %49s %d:%d-%d:%d

e o seguinte formato : %49[^\n] %d-%d-%d %d

a todos (e digo mesmo todos) os caracteres de texto descritos no teu exemplo :

Arnaldo Antunes
12-1-1956
2
Normal - 13/08/2016 - Joao Silva
Normal - 17/05/2016 - Joao Silva
Ana Sofia Ramos
23-6-1999
0

Já consegui fazer com que a aparece toda a informaçao de um paciente, ou seja, isto:
Arnaldo Antunes
12-1-1956
2
Normal - 13/08/2016 - Joao Silva
Normal - 17/05/2016 - Joao Silva

Agora para mostrar o outro paciente, tenho de fazer um for no printf? Ou já era suposto aparecer tudo?

Share this post


Link to post
Share on other sites
joanacs
Agora, HappyHippyHippo disse:

nao sei ... como está o código que tens no momento ?

printf("\n\nPACIENTES\n");
    while (fscanf(g,"%49[^\n] %d-%d-%d %d",a->nome, &a->d_n.dia, &a->d_n.mes, &a->d_n.ano, &a->consultas)==5){
            printf("Nome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",a->nome, a->d_n.dia, a->d_n.mes, a->d_n.ano, a->consultas);
            for(i=0;i<a->consultas;i++){
                fscanf(g,"%s - %d/%d/%d - %[^\n]",a->h.grau, &a->h.d_dia, &a->h.d_mes, &a->h.d_ano, &a->h.nome);
                printf("\t%s %d/%d/%d %s\n",a->h.grau, a->h.d_dia, a->h.d_mes, a->h.d_ano, a->h.nome);
            }
    }

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok

então tens o código para ler um médico e os seus pacientes, agora é repetir (claro que não é com copy-paste)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.