0
I’m doing a program that dynamically allocates student structures and registers the grades of diverse students. Until then, everything ok (shows the average, higher and lower grade and the total students when terminating the program), but now I need to do the file processing.
Except that the way I’m doing, I basically write any number plate (regardless of whether you have it or not) and then write it in the text file, but I wish I didn’t have to write it again and take the number plate and note that were registered at the beginning of the program. And then when you hit the read option, just show the already saved information (and don’t re-register).
I’ll leave the complete code, it’s no build error, so if it gets easier to understand, just run.
ps: It is my first contact with file handling, I have to study much more and accept website/video indications as well. But as I’ve been searching for a week and can not solve, I would like help from the most experienced =]
Thanks in advance!
#include <stdio.h>
#include <stdlib.h>
struct Aluno
{
int matricula;
int nota;
};
void cadastraMatricula(struct Aluno *alunos, int quantidadeAlunos);
float calcularMediaAlunos(struct Aluno *alunos, int quantidadeAlunos);
void encontrarMaiorEMenorNota(struct Aluno *alunos, int quantidadeAlunos, int *maiorNota_p, int *menorNota_p);
int GravaArquivo(char *arquivo, char *modo, char* texto);
void Leitura(char* arquivo, char* modo);
void BuscaLinha(char * linha);
void Gravacao(char* arquivo, char* modo);
int BuscaDados(FILE* Arq, char* linha);
int main()
{
char* arquivo = "ArquivoTex.txt";
char* modo = "a+";
struct Aluno *alunos = NULL;
int op = -1, alunosTot = 0, maiorNota = 0, menorNota = 0;
do
{
printf("\nEscolha uma opcao abaixo:");
printf("\n0 - Encerrar o Programa\n");
printf("1 - Cadastrar Aluno\n");
printf("2 - Ler os dados do arquivo\n");
scanf("%d", &op);
if (op == 1)
{
struct Aluno *aluno_temp_p = (struct Aluno *)realloc(
alunos, (alunosTot + 1) * sizeof(struct Aluno));
if (aluno_temp_p != NULL)
{
cadastraMatricula(aluno_temp_p, alunosTot);
alunos = aluno_temp_p;
alunosTot += 1;
}
}
else if (op == 2){
// Faz UMA gravacao de cada vez
Gravacao(arquivo,modo);
// Faz a leitura de TODAS as linha do arquivo
Leitura(arquivo, modo);
}
}
while (op != 0);
printf("- Total de Alunos: %d\n", alunosTot);
encontrarMaiorEMenorNota(alunos, alunosTot, &maiorNota, &menorNota);
printf("- Menor Nota: %d\n", menorNota);
printf("- Maior Nota: %d\n", maiorNota);
printf("- Media Geral: %.2f", calcularMediaAlunos(alunos, alunosTot));
printf("\n------------------------------\n");
}
void cadastraMatricula(struct Aluno *alunos, int quantidadeAlunos)
{
printf("\nInforme a matricula: \n");
scanf("%d", &alunos[quantidadeAlunos].matricula);
printf("Informe a nota:\n");
scanf("%d", &alunos[quantidadeAlunos].nota);
}
float calcularMediaAlunos(struct Aluno *alunos, int quantidadeAlunos)
{
int i = 0, soma = 0;
if (quantidadeAlunos == 0)
{
return 0;
}
for (i = 0; i < quantidadeAlunos; i++)
{
soma += alunos[i].nota;
}
return (float)soma / quantidadeAlunos;
}
void encontrarMaiorEMenorNota(struct Aluno *alunos, int quantidadeAlunos,
int *maiorNota_p, int *menorNota_p)
{
int i = 0;
if (quantidadeAlunos == 0)
{
*maiorNota_p = 0;
*menorNota_p = 0;
}
else
{
for (i = 0; i < quantidadeAlunos; i++)
{
if (alunos[i].nota > *maiorNota_p)
{
*maiorNota_p = alunos[i].nota;
}
else if (alunos[i].nota < *menorNota_p)
{
*menorNota_p = alunos[i].nota;
}
}
}
}
void Leitura(char* arquivo, char* modo)
{
FILE* Arq;
int retorno=99;
char buffer[1024];
Arq = fopen(arquivo, modo);
if (Arq == NULL)
{
printf("Erro na abertura do arquivo...");
return;
}
printf("\n");
while (retorno != 0)
{
retorno = BuscaDados(Arq, buffer);
if (retorno != NULL)
printf("\n ---> %s ", buffer);
}
printf("\n");
fclose(Arq);
}
int GravaArquivo(char *arquivo, char *modo, char* texto)
{
FILE* Arq;
int retorno=0;
Arq = fopen ( arquivo, modo ) ;
if(Arq == NULL)
{
printf("Erro na abertura do arquivo!");
return (-1);
}
retorno = fputs(texto, Arq);
if (retorno != 0)
{
printf("Erro de gravacao!");
return (-1);
}
fclose(Arq);
return 0;
}
void BuscaLinha(char * aluno)
{
printf("\nDigite : ");
scanf("%s",aluno);
}
void Gravacao(char* arquivo, char* modo)
{
char buffer[1024];
BuscaLinha(buffer);
strcat(buffer,"\n");
if (GravaArquivo(arquivo, modo, buffer) != 0)
{
printf("Erro na gravacao do arquivo!");
}
}
int BuscaDados(FILE* Arq, char* linha)
{
char buffer[1024];
linha[0] = '\0';
int resultado = 0;
resultado = fgets(linha, sizeof(buffer), Arq);
return resultado;
}
Alic, welcome to [en.so], do not use greetings/greetings in questions, see what kind of behavior is expected from users
– gleisin-dev
Thank you! Edited here hahaha
– Alic