Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×