JA86 Posted January 14, 2020 at 11:40 PM Report Share #617065 Posted January 14, 2020 at 11:40 PM Tenho um problema no meu codigo que é o seguinte , insiro um aluno, elimino o mesmo e depois volto a inserir com o mesmo nome outro aluno ele aparece na listagem, mas não me deixa pesquisar nem alterar. #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <locale.h> struct Alunos { char Nome[50]; char Idade[5]; char Numero[5]; char Nacionalidade[20]; char Turma[20]; char status; } reg; FILE *fp; /*prototipo das funcoes*/ void inserir (void); void pesquisar (void); void eliminar(void); void atualizar(void); void abrir(void); void listagem(void); int main(void) { setlocale(LC_ALL, "Portuguese"); char opcao[2], op; do{ do{ printf("\n\n\n\n\n\n\n"); printf("\t########################################################\n"); printf("\t# #\n"); printf("\t# Programa de Registo Alunos #\n"); printf("\t# #\n"); printf("\t########################################################\n\n\n"); printf("\n Escolha a Opção Pretendida \n\n"); printf("\n <I> - Inserir"); printf("\n <A> - Atualizar"); printf("\n <E> - Eliminar"); printf("\n <C> - Consultar"); printf("\n <L> - Listagem"); printf("\n <S> - Sair"); printf("\n\n\n Opção:"); gets(opcao); op=tolower(*opcao); } while(!strchr("iaeclsh",op)); switch(op){/*D*/ case 'i' : inserir(); break; case 'a' : atualizar(); break; case 'e' : eliminar(); break; case 'c' : consultar(); break; case 'l' : listagem(); break; case 's' : exit(0); } }while(1); } /*Declaração De Funções*/ void abrir(const char tipo[3]) { if((fp=fopen("alunos.dat", tipo))==NULL) {printf("\n Este Arquivo Não Pode Ser Aberto!!\n"); getch(); exit(1); } } void inserir(void) { //char *um="0"; abrir("ab+"); fseek(fp,0L, SEEK_END); do { printf("\n Digite o Nome do Aluno ou <EXIT> para sair:\n\n"); gets(reg.Nome); if ((strcmp(reg.Nome,"exit")!=0)&&(strcmp(reg.Nome,"EXIT")!=0)&&(strcmp(reg.Nome,"Exit")!=0)){ printf("\n Idade:"); gets(reg.Idade); printf("\n Numero:"); gets(reg.Numero); printf("\n Nacionalidade:"); gets(reg.Nacionalidade); printf("\n Turma:"); gets(reg.Turma); reg.status='1'; if(fwrite(®, sizeof(struct Alunos), 1, fp) != 1) { printf("\n Erro Na Gravação!!"); getch(); } else { printf("\n Gravação Efetuada Com Sucesso...\n\n");} } }while((strcmp(reg.Nome,"exit")!=0)&&(strcmp(reg.Nome,"EXIT")!=0)&&(strcmp(reg.Nome,"Exit")!=0)); fclose(fp); } int pesquisa (void){ int achou=-1,posicao=0; char Nome [40]; abrir("rb"); printf("\nDigite o Nome a Ser Pesquisado:"); gets(Nome); rewind(fp); while((!feof(fp))&&(achou==-1)) { fread(®, sizeof(struct Alunos), 1, fp); if (!feof(fp)) {if (strcmp(Nome, reg.Nome)==0) {if (reg.status=='0') {posicao=-2;} achou=1; } else{posicao++;} } else{posicao=-1;} } if (achou==-1) {posicao=-1;} fclose(fp); return(posicao); } void pesquisar(void){ int pos; pos=pesquisa(); if(pos==-1) { printf("\nAluno Não Existe!"); getch(); } else if(pos==-2) { printf("\nAluno Não Existe!"); getch(); } else { abrir("rb+"); fseek(fp,pos*sizeof(struct Alunos),SEEK_SET); fread(®, sizeof(struct Alunos), 1, fp); printf("\nNome:%s",reg.Nome); printf("\n Idade:"); gets(reg.Idade); printf("\n Numero:"); gets(reg.Numero); printf("\n Nacionalidade:"); gets(reg.Nacionalidade); printf("\n Turma:"); gets(reg.Turma); getch(); } fclose(fp); } void atualizar(void){ int posA; posA=pesquisa(); if (posA==-1) { printf("\nAluno Não Existe"); getch(); } else if(posA==-2) { printf("\nAluno Não Existe!"); getch(); } else { abrir("rb+"); fseek(fp,posA*sizeof(struct Alunos),SEEK_CUR); fread(®, sizeof(struct Alunos), 1, fp); printf("\nDeseja Atualizar o Seguinte Aluno..."); printf("\nAluno:%s",reg.Nome); printf("\nIdade:%s",reg.Idade); printf("\nNumero:%s",reg.Numero); printf("\nNacionalidade:%s",reg.Nacionalidade); printf("\nTurma:%s",reg.Turma); getch(); printf("\nInsira as Informações Correctas:"); printf("\nAluno:"); gets(reg.Nome); printf("\nIdade:"); gets(reg.Idade); printf("\nNumero:"); gets(reg.Numero); printf("\nNacionalidade:"); gets(reg.Nacionalidade); printf("\nTurma:"); gets(reg.Turma); reg.status='1'; fseek(fp,posA*sizeof(struct Alunos),SEEK_SET); if(fwrite(®, sizeof(struct Alunos),1, fp)!=1) { printf("\n Erro Na Gravação!!"); } else { printf("\nActualização Efetuada Com Sucesso"); getch(); } } fclose(fp); } void listagem(void) { int cont=0; abrir("rb"); fseek(fp, 0L, SEEK_SET); fread(®, sizeof(struct Alunos),1, fp); do { if (reg.status!='0') { printf("\nNome: %s",reg.Nome); printf("\nIdade: %s",reg.Idade); printf("\nNumero: %s",reg.Numero); printf("\nNacionalidade: %s",reg.Nacionalidade); printf("\nTurma: %s",reg.Turma); cont++; } fread(®, sizeof(struct Alunos),1, fp); }while(!feof(fp)); printf("\n#Quantidade de Alunos Presentes no Registo=%d",cont); getch(); } void eliminar(void){ int posE; posE=pesquisa(); if(posE==-1) { printf("\nAluno Não Existe!"); getch(); } else { if(posE==-2) { printf("\nAluno Eliminado do Registo!"); getch(); } else { abrir("rb+"); fseek(fp, posE*sizeof(struct Alunos), SEEK_SET); fread(®, sizeof(struct Alunos), 1, fp); printf("\nNome: %s",reg.Nome); printf("\nIdade: %s",reg.Idade); printf("\nNumero: %s",reg.Numero); printf("\nNacionalidade: %s",reg.Nacionalidade); printf("\nTurma: %s",reg.Turma); printf("\nEste Registro #%d sera excluido",(posE+1)); getch(); reg.status='0'; fseek(fp, posE*sizeof(struct Alunos), SEEK_SET); if(fwrite(®, sizeof(struct Alunos), 1, fp)!=1) { printf("\n Erro Na Gravação!!"); getch(); } else { printf("\n Eliminação Efetuada Com Sucesso...\n\n"); getch(); } } } fclose(fp); } Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted January 15, 2020 at 09:54 PM Report Share #617080 Posted January 15, 2020 at 09:54 PM A compilação dá algum erro ou warning? Porque é que há duas funções um chamada pesquisa() e outra chamada pesequisar()?? Se houver warnings, mostra quais são. Não uses o gets() nem o getchar(). Acho que já são funções deprecadas e com problemas de segurança. O que é que acontece quando tentas pesquisar o nome? Que mensagens mostra? Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
JA86 Posted January 15, 2020 at 10:43 PM Author Report Share #617082 Posted January 15, 2020 at 10:43 PM 39 minutes ago, PsySc0rpi0n said: A compilação dá algum erro ou warning? Porque é que há duas funções um chamada pesquisa() e outra chamada pesequisar()?? Se houver warnings, mostra quais são. Não uses o gets() nem o getchar(). Acho que já são funções deprecadas e com problemas de segurança. O que é que acontece quando tentas pesquisar o nome? Que mensagens mostra? Não compila sem warnings. o int pesquisa () é para pesquisar no ficheiro o que quero eliminar ou alterar ou pesquisar pesquisar () é para apresentar aquilo que pesquisei o problema que tenho é intrudosu dados, e depois elimino, e quando insiro dados iguais eles aparecem na listagem mas se eu os tentar alterar ou pesquisar dá que não os encontra, e não percebo porque Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted January 17, 2020 at 09:46 PM Report Share #617110 Posted January 17, 2020 at 09:46 PM Eu sugeria que fosses fazendo printf() das variáveis à medida que elas vão alterando, para tentares perceber onde é que algo que não seja epxerado, está a acontecer! Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now