Ir ao conteúdo
  • Cadastre-se
berg0410

C RESOLVIDO exclusão de registro em arquivo binario

Recommended Posts

Sou novato em programação e estou estudando mais a fundo a programação e C com manipulação de arquivos binários, seguindo alguns tutoriais na web consegui desenvolver um código. A minha duvida é a seguinte: não estou conseguindo excluir um determinado registro com base no ID informado pelo usuário. Se alguém tiver uma solução desde já agradeço.

 

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


typedef struct aluno{
	int id;
	char nome[50];
	float nota;
}aluno;

int main(int argc, char *argv[]) {
	
	char op;
	char resp='s';
	int x;
	
	aluno esc[500];
	
	FILE *arquivo, var1, var2;
	arquivo=fopen("testeLeitura.dat", "ab");
	
	printf("1- cadastrar\n2- consultar\n3- deletar\n");
	op=getche();
	fflush(stdin);
	switch(op){
		case '1':
		while(resp!='n'){
			system("cls");
			printf("\nId: ");
			scanf("%i", &esc[x].id);
			fflush(stdin);
			printf("\nnome: ");
			gets(esc[x].nome);
			printf("nota: ");
			scanf("%f", &esc[x].nota);

			fwrite(&esc, sizeof(aluno), 1, arquivo);
	
			printf("\ndeseja cadastrar outro aluno?");
			scanf("%s", &resp);
			fflush(stdin);
			if(resp!='n') x++;
		}	
			fclose (arquivo);
			fflush(stdin);
		break;
		case '2':
			system("cls");
			arquivo=fopen("testeLeitura.dat", "rb");
			
			x=0;
			
			//fseek(arquivo, 2*sizeof(struct aluno), SEEK_SET); //teste fseek.
			
			while(fread(&esc[x], sizeof(aluno), 1, arquivo)>0){
				if(esc[x].id!=-1){
							
					printf("\n-------------------------------------\n");
					printf("id: %i\n", esc[x].id);
					printf("nome: %s\n", esc[x].nome);
					printf("nota: %.2f\n", esc[x].nota);
					x++;
				}
			}
		fclose(arquivo);
		break;	
		case '3'://não funciona
		x=0;
		arquivo=fopen("testeLeitura.dat", "r+b");
			int mat;
			printf("digite o id a ser apagado: ");
			scanf("%i", &mat);
			fflush(stdin);
			x=mat;
			
			rewind(arquivo);
			
			while(feof(arquivo)==0){
				long int pos = ftell(arquivo);
				fread(&esc, sizeof(aluno), 1, arquivo);
				
				if(mat == esc[mat].id){
					fseek(arquivo, pos, SEEK_SET);
					aluno aux;
					aux.id=-1;
					fwrite(&aux, sizeof(aluno), 1, arquivo);
				}break;
			}
		rewind(arquivo);
		fclose(arquivo);
		break;
	}

	return 0;

}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@berg0410    creio que seu while nessa opção 3 esteja com problemas ,  e também você precisa transferir os dados que você não quer deletar,  para outro arquivo e depois que terminar de ler o arquivo principal  e transferir os dados você deleta esse arquivo principal usando o comando remove("nome_do_arquivo.dat") ;  e em seguida renomeie o outro arquivo que contém os dados que você não quer deletar usando o comando rename("nome_do_outro_arquivo.dat","nome_do_arquivo") ;    assim  seu arquivo original estará com todos os dados , menos o que você deletou .   então seu código ficaria assim  :

#include <stdio.h>
#include <stdlib.h>
typedef struct aluno{
    int id;
    char nome[50];
    float nota;
}aluno;
int main(){
    char op;
    char resp='s';
    int flag,i,j,x=0;/* precisa inicializar */
    aluno esc[500];
    FILE *arquivo,*arquivo2, var1, var2;
    do{
        op='0';
        system("cls");
        printf("1- cadastrar\n2- consultar\n3- deletar\n4- Sair Do Programa\n");
        fflush(stdin);
        op=getche();
        switch(op){
        case '1':
            arquivo=fopen("testeLeitura.dat", "ab");
            resp='s';
            while(resp!='n'){
                system("cls");
                printf("Id ----: "); 
                scanf("%d",&esc[x].id);
                fflush(stdin);
                printf("nome --: ");
                gets(esc[x].nome);
                printf("nota --: ");
                fflush(stdin);
                scanf("%f", &esc[x].nota);
                fwrite(&esc[x], sizeof(aluno), 1, arquivo);
                printf("\ndeseja cadastrar outro aluno?");
                fflush(stdin);
                scanf("%c",&resp);
                if(resp!='n') x++;
            }
            fclose (arquivo);
            break;
        case '2':
            system("cls");
            arquivo=fopen("testeLeitura.dat", "rb");
            x=0;
            while(fread(&esc[x], sizeof(aluno), 1, arquivo)>0){
                if(esc[x].id!=-1){
                    printf("\n-------------------------------------\n");
                    printf("id ------: %i\n"  ,esc[x].id  );
                    printf("nome ----: %s\n"  ,esc[x].nome);
                    printf("nota ----: %.2f\n",esc[x].nota);
                    x++;
                }
            }
            fclose(arquivo);
            printf("\n          Tecle !"); 
            getch();
            break;
        case '3':
            x=0;
            arquivo =fopen("testeLeitura.dat", "rb");
            arquivo2=fopen("testeLeitura2.dat","ab");
            int mat;
            printf("digite o id a ser apagado: ");
            fflush(stdin);
            scanf("%d",&mat);
            while(fread(&esc[x], sizeof(aluno), 1, arquivo)>0){
                if(esc[x].id != mat){
                    fwrite(&esc[x], sizeof(aluno), 1, arquivo2);
                    x++;
                }
            }
            fclose(arquivo);
            fclose(arquivo2);
            remove("testeLeitura.dat");
            rename("testeLeitura2.dat","testeLeitura.dat");
            printf("\nExclusao Concluida Com Sucesso !\n\n");
            printf("        Tecle !\n\n");
            getch();
            break;
        }
    }while(op!='4');
  return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×