How to pass, by reference, a vector of structures to a function?

Asked

Viewed 156 times

0

I’m having great difficulty understanding the reference passage of a structure vector. No running error happening, but not sure if I am reading the file correctly there.

     #include <stdio.h>
     #include <stdlib.h>
     #include <stdio.h>
     #include <string.h>



     #define NUM_MAX_ALUNOS 120
     #define MAX_NOME_ALUNO 100


     /*


     SÍNTESE
     OBJETIVO: Fazer o controle das médias finais de alunos de uma discplina
     ENTRADA: Numero da matricula, nota da primeira prova, nota da segunda prova e nome do aluno
     SAÍDA: Arquivo gravado com alunos que comecem com as letras A a M, e outro com o restante dos alunos, cabeçalho
     na primeira linha do arquivo(que identifique cada coluna na tabela) e na última linha do arquivo o númer de estudantes, mensagem
 se matrícula inválida,
     mensagem se matrícula repetida, mensagem se nota inválida, mensagem se nome inválido 
     (gravados num arquivo erros.txt informando o número da linha onde o erro foi detectado, o conteúdo da linha e a descrição do erro)
     Se existir pelo menos uma linha com erro, o usuário deve ser avisado e o programa encerrado



     *Os nomes do 2 arquivos de saída

     - Dados ordenados segundo nomes de alunos de A a M
     - E dados com nomes dos alunos restantes dos alunos

     - Arquivo com dados gravados dos erros (log)

     *Entrada

     Dados para leitura gravados em arquivo



     */



     struct Disciplina{

            int matricula;
            float nota1, nota2;
            char nomeAluno[MAX_NOME_ALUNO];


        };




     void zerarEstrutura(struct Disciplina* disciplina);
     void lerDadosArqEntrada(struct Disciplina* disciplina);
     void ValidarDadosArqEntrada();
     void OrdenarDadosAlunos();
     void GravarDadosArqSaida();

     int main(int argc, char *argv[]) {

        //declara o vetor de structs
        struct Disciplina disciplina[NUM_MAX_ALUNOS];
        zerarEstrutura(disciplina);
        lerDadosArqEntrada(disciplina);





        return 0;   

     }

     void lerDadosArqEntrada(struct Disciplina * disciplina){




        FILE * arq;
        arq = fopen("dados_entrada.txt", "r");

        int i=0;

        if(arq == NULL){

            printf("\nOcorreu um erro! O arquivo deve existir!");
            exit(1);
        }


        else{
            for(i=0; i<NUM_MAX_ALUNOS; i++){
                while(fscanf(arq, "%d %f %f %[^\n]s\n", &(disciplina+i)-matricula, &(disciplina+i)->nota1,
 &(disciplina+i)->nota2, (disciplina+i)->nomeAluno)!=EOF){
                printf("Matricula: %d\nNota1: %f\nNota2: %f\nNome Aluno: %s", disciplina->matricula, disciplina->nota1, disciplina->nota2,
 disciplina->nomeAluno);
            }

            }

            fclose(arq);

        }





     }

     void zerarEstrutura(struct Disciplina* disciplina){


        int i=0;
        for(i=0;i<NUM_MAX_ALUNOS;i++){
            (disciplina+i)->matricula = 0;
            strcpy((disciplina+i)->nomeAluno, "");
            (disciplina+i)->nota1 = 0;
            (disciplina+i)->nota2 = 0;  

        }



     }

1 answer

0


In function lerDadosArqEntrada(), you have to do printf of the same fields that were used in the fscanf, otherwise the same values will always be printed. That is, if you read from the file to &(disciplina+i)->matricula, shall print the same (disciplina+i)->matricula.

In the format string of fscanf has a wrong token: %[^\n]s. Take off the s out of.

The header stdio.h was included twice. Remove an occurrence.

EDIT: maybe the notation disciplina[i].matricula is more intuitive than (disciplina + i)->matricula?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.