Problem with fscanf

-1

Good evening! I have a question on my second fscanf from PATIENTS, because I wanted to save the date that appears in the text file (the day in a-> h.d_day, the month in a-> h.d_mes and the year in a-> h.d_ano), but random numbers are appearing on the console. Does anyone know how to help me?

Q: In the doctors' part, something was also supposed to appear, but I can not find the error. If anyone knows, I also thank you.

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);
}

    
asked by anonymous 08.08.2017 / 00:13

1 answer

0

The reading that is being made in the patient file does not match the way the data is arranged in it.

In addition, for is not within while because { is missing despite visually deceiving by indentation.

Then this:

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);
    }

To be properly indented it should look like this:

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);
}

To fix the braces and fscanf s it should look like this:

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++)
    {
        //este fscanf ficou agora como %s - %d/%d/%d - %*[^\n]\n
        fscanf(g,"%s - %d/%d/%d - %*[^\n]\n",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);
    }
}

While already going through the correct data each history line, in for h is to be superimposed on the previously read line, and the same as the a referring to the patient and overlays the previous patient.

It is therefore necessary to create structures, such as lists or arrays, that store the various history lines and patients, in the right places.

Edit (referring to storing elements dynamically)

To save the elements, which comes in the file needs arrays or lists, and curiously its paciente and medico structures are already ready!

If we look closely:

struct paciente
{
    ...
    p_pac prox; //typedef struct paciente pac, *p_pac;
};

Where p_pac is basically paciente* ie a pointer to the next paciente . And the same happens in the medico structure:

struct medico
{
    ...
    p_med prox;  //typedef struct medico med, *p_med;
};

We can start by creating two functions to show each of the lists following the sampling style you were using:

void imprimirMedicos(med *lista){
    while (lista != NULL){
        printf("%s %s %d %d %d %d\n",lista->nome, lista->especialidade, lista->h_e.horas,
               lista->h_e.minutos, lista->h_s.horas, lista->h_s.minutos);

        lista = lista->prox;
    }
}

void imprimirPacientes(pac *lista){
    while (lista != NULL){
        printf("\nNome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",lista->nome, lista->d_n.dia, lista->d_n.mes,
               lista->d_n.ano, lista->consultas);
        lista = lista->prox;
    }
}

With some corrections since it had printf s using the address of the variable ( & ) that is not supposed, for example here:

while (fscanf(f, ...) == 6 )
    printf("%s %s %d %d %d %d\n" ..., &v->h_e.horas, &v->h_e.minutos, ...);

Now each time you read you can build the list forward. I tried to use a simple way to build the list that implies that it does not change much of what it has and so it does not mean that it is the best implementation. But it would look something like:

int le_dados ()
{
    FILE *f, *g;

    med *v = malloc (sizeof(med));
    pac *a = malloc (sizeof(pac));

    ... //abertura dos ficheiros e ifs que estavam aqui antes

    printf("\nMEDICOS\n");
    med *listaMedicos = v; //dizer que a lista começa no v, o primeiro médico
    med *anterior = NULL; 

    while (fscanf(f,"%49[^\n] %49s %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 )==6 ){
        v->prox = malloc (sizeof(med)); //alocar um Nó para o próximo médico
        anterior = v; //ponteiro para o médico antes do fim
        v = v->prox;
    }

    if (anterior == NULL){ //não deu para ler nenhum médico libertar o único nó alocado
        free(listaMedicos);
        listaMedicos = NULL;//por a único apontar para NULL a impressão funcionar 
    }
    else {
        free(anterior->prox);//libertar o ultimo médico alocado que não foi utilizado
        anterior->prox = NULL;//por a ultimo apontar para NULL a impressão funcionar 
    }

    imprimirMedicos(listaMedicos);


    pac *listaPacientes = a; //dizer que a lista começa no a, o primeiro paciente
    pac *antPac = NULL;

    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) {

        for(i=0; i<a->consultas; i++)
        {
            //agora com * para ignorar e ler sem colocar em lado nenhum
            fscanf(g,"%*s - %*d/%*d/%*d - %*[^\n]\n");
        }

        a->prox = malloc(sizeof(pac)); //alocar um Nó para o próximo paciente
        antPac = a; //ponteiro para o antes do fim
        a = a->prox;
    }

    if (antPac == NULL){//não deu para ler nenhum paciente, libertar o único nó alocado
        free(listaPacientes);
        listaPacientes = NULL;//por a único apontar para NULL a impressão funcionar 
    }
    else {
        free(antPac->prox); //libertar o ultimo paciente alocado que não foi utilizado
        antPac->prox = NULL;//por a ultimo apontar para NULL a impressão funcionar 
    }

    imprimirPacientes(listaPacientes);
}

Lets purposely implement the part of history to be able to exercise your programming techniques. I would however remind you that the history structure is not yet poised to function as a list.

    
08.08.2017 / 03:30