I have a function in my program where it shows all the students registered in a binary file, the user selects which one to delete, a confirmation screen with the user data waiting for the input appears for then deletion confirmation occurs.
When registering a student and deleting it, the program works correctly, after another enrollment, I can no longer exclude students. Follow the function below.
A perror();
in remove(arqAlunos)
returns the following string Permission Denied.
void excluirAluno () {
// Declarações locais
struct Alunos aluno;
FILE *arqAlunos = NULL, *arqTemp = NULL;
int posicaoArquivo = 0, totalPosicoes = 0, flag1 = 0, flag2 = 0, contador = 0;
char opcao;
// Instruções
do {
posicaoArquivo = apresentaAlunos(); // Apresenta todos os alunos cadastrados no sistema (caso exista algum).
arqAlunos = fopen(ARQ_ALUNOS, "rb"); // Abre para leitura.
if (arqAlunos != NULL) { // Considera a existência do arquivo...
fseek(arqAlunos, 0, SEEK_END); // Posiciona-se no final do arquivo.
totalPosicoes = (ftell(arqAlunos) / sizeof(aluno)); // Cálculo do total de bytes na primeira posição do arquivo.
if (posicaoArquivo != 0) { // Considera que existe ao menos um aluno cadastrado no sistema.
fseek(arqAlunos, ((posicaoArquivo - 1) * sizeof(aluno)), SEEK_SET); // Posiciona-se na posição referente ao cálculo do segundo parâmetro.
if (fread(&aluno, sizeof(aluno), 1, arqAlunos) == 1) { // Lê os dados do arquivo um a um.
flag1 = verificaAlunoMatriculado(aluno.matricula); // Verifica se o aluno está matriculado em algum curso.
clrscr();
desenhaMoldura(10, 10, 18, 70, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("%-19.19s%-14.14s%-13.13s%-13.13s", "NOME", "CPF", "SEXO", "MATRICULA");
gotoxy(11,12);
printf("%-16.16s%-9.11s %11.11s%13d", aluno.nome, aluno.CPF, aluno.sexo, aluno.matricula);
gotoxy(15,16);
printf("DESEJA EXCLUIR OS DADOS DESTE ALUNO? (S / N): ");
fflush(stdin);
scanf("%c", &opcao);
fflush(stdin);
opcao = toupper(opcao);
while ((opcao != 'S') && (opcao != 'N')) {
clrscr();
desenhaMoldura(10, 10, 14, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("OPCAO INVALIDA");
gotoxy(11,12);
printf("UTILIZE [S] OU [N]");
gotoxy(11,13);
printf("SUA ESCOLHA: ");
fflush(stdin);
scanf("%c", &opcao);
fflush(stdin);
opcao = toupper(opcao);
}
if ((opcao == 'S') && (flag1 == 0)) { // Caso o usuário deseje remover um aluno e ele não esteja matriculado em algum curso.
clrscr();
arqTemp = fopen(ALUNOS_TEMP, "wb"); // Criação de um arquivo temporário para os alunos.
if (arqTemp != NULL) {
rewind(arqAlunos); // Vai para o início do arquivo.
while (!feof(arqAlunos)) { // Enquanto não atingir o final do arquivo.
if (fread(&aluno, sizeof(aluno), 1, arqAlunos) == 1) { // Lê dados um a um no arquivo.
contador++; // Incremento do contador.
if (contador != posicaoArquivo) { // Enquanto contador não atingir o total de registros gravados no arquivo...
if (fwrite(&aluno, sizeof(aluno), 1, arqTemp) != 1) { // Gravará todos os dados originais no arquivo temporário.
desenhaMoldura(10, 10, 12, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO GRAVAR ARQUIVO TEMPORÁRIO.");
getch();
}
}
}
}
if (fclose(arqAlunos) != 0) { // Caso ocorra erro ao fechar o arquivo principal.
desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO FECHAR O ARQUIVO PRINCIPAL.\n");
gotoxy(11,12);
perror("Erro");
getch();
}
else {
flag2 = 1;
if (fclose(arqTemp) != 0) { // Caso ocorra erro ao fechar o arquivo temporário.
desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO FECHAR O ARQUIVO TEMPORARIO.\n");
gotoxy(11,12);
perror("Erro");
getch();
}
else {
if (remove(ARQ_ALUNOS) != 0) { // Caso ocorra erro ao remover o arquivo principal.
desenhaMoldura(10, 10, 13, 46, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO REMOVER O ARQUIVO ALUNOS.\n");
gotoxy(11,12);
perror("Erro");
getch();
}
else {
if (rename(ALUNOS_TEMP, ARQ_ALUNOS) != 0) { // Caso ocorra erro ao renomear o arquivo temporário.
desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO RENOMEAR ARQUIVO.\n");
gotoxy(11,12);
perror("Erro");
getch();
}
else {
// Caso tudo ocorra corretamente, a mensagem abaixo será exibida.
desenhaMoldura(10, 10, 12, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("EXCLUSAO REALIZADA COM SUCESSO!");
getch();
}
}
}
}
}
}
else {
if (flag1 == 1 && opcao == 'N') {
return;
}
else if (flag1 == 1) {
// 'flag1' indica que o aluno já está matriculado em algum curso, portanto não poderá ser excluido do sistema.
clrscr();
desenhaMoldura(10, 10, 13, 55, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ESTE ALUNO JA ESTA MATRICULADO EM UM CURSO.");
gotoxy(11,12);
printf("NAO PODERA SER REMOVIDO DO SISTEMA.");
getch();
}
}
}
}
if (flag2 == 0) {
if (fclose(arqAlunos) != 0) {
desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
gotoxy(11,11);
printf("ERRO AO FECHAR O ARQUIVO ALUNOS.\n");
gotoxy(11,12);
perror("Erro");
getch();
}
}
}
clrscr();
} while (posicaoArquivo != 0);
}