Ir ao conteúdo

C exclusão de registro em arquivo binario


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
  • Solução
Postado

@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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!