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.