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

0

I'm having a hard time understanding the passing by reference of a vector of structures. There is no running error, but I'm not sure if I'm reading the file right 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;  

        }



     }
    
asked by anonymous 23.05.2018 / 16:00

1 answer

0

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

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

The header s has been added twice. Remove an occurrence.

EDIT: Maybe stdio.h notation is more intuitive than disciplina[i].matricula ?

    
24.05.2018 / 02:11