Ir ao conteúdo
  • Cadastre-se

C Agenda em C - Função Remover


Valiwne

Posts recomendados

Oá galera,

 

Tenho que fazer uma Agenda em C com arquivos txt , fiz todas funções Adicionar,Listar,Consultar mas não sei como fazer a de excluir levando em conta que fiz usando função.

Se puderem me ajudar agradeço

 

Aqui embaixo esta o codigo:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>

typedef struct contato CONTATO;
struct contato{
	char nome[40];
	char telefone[20];
};

void cabecalho();
void cadastrar();
void listar();
void consultar();


int main(){
	setlocale(LC_ALL,"Portuguese");
 	int op;
 	
	
	do{
		cabecalho();
		printf("1 - Cadastrar\n");
		printf("2 - Listar \n");
		printf("3 - Consultar \n");
		printf("4 - Excluir \n");
		printf("5 - Sair \n");
		printf("Escolha uma opção:\n");
		scanf("%d" ,&op);
		
		switch(op){
			
			case 1:
				cadastrar();
				
			break;
			
			case 2:
				listar();
			break;
			
			case 3:
				consultar();
			break;
			
			case 4:
			//	excluir();
			break;
			
			default:
				printf("Opcao invalida!");
				getch();
			break;
		}
		
	}while(op!=5);
	return 0;
}


void cabecalho(){
	system("cls");
	printf("---------------\n");
	printf("AGENDA\n");
	printf("---------------\n");
}

void cadastrar(){
	FILE* arquivo;
	CONTATO ctt;
	int resp;
	
	cabecalho();
	
	arquivo = fopen("agenda.txt", "ab");
	if (arquivo==NULL){
		printf("Problema na abertura do arquivo");
		
	}
	else{
		do{
		
		
		
		fflush(stdin);
		printf("Digite o nome:");
		gets(ctt.nome);	
		
		fflush(stdin);
		printf("Digite o telefone:");
		gets(ctt.telefone);
		
		fwrite(&ctt, sizeof(CONTATO),1,arquivo);
		printf("Deseja continuar?\n");
		printf("0 - Sair\n");
		printf("1- Continuar \n");
		scanf("%d" ,&resp);
		
		}while(resp == 1);
		fclose(arquivo);
	}
	
}

void listar(){

	FILE* arquivo;
	CONTATO ctt;
	
	cabecalho();
	arquivo = fopen("agenda.txt", "rb");
	if (arquivo==NULL){
		printf("\nProblema na abertura do arquivo\n");
		
	}
	else{
		while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1){
			printf("\nNome:%s\n", ctt.nome);
			printf("\nNome:%s\n", ctt.telefone);
		}
	}
	fclose(arquivo);
	getch();
}

void consultar(){
	FILE* arquivo;
	CONTATO ctt;
	char nome[30];
	
	cabecalho();	
	arquivo = fopen("agenda.txt", "rb");
	if (arquivo==NULL){
		printf("Problema na abertura do arquivo!\n");
		
	}
	else{
		fflush(stdin);
		printf("Digite o nome que você quer pesquisar:\n");
		gets(nome);
		
		while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1){
			if (strcmp(nome,ctt.nome)==0){
				printf("\nNome:%s\n", ctt.nome);
				printf("\nNome:%s\n", ctt.telefone);
			}
			
		}
	}
	fclose(arquivo);
	getch();
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Valiwne use uma struct temporária qualquer, depois só escreve em um arquivo diferente e no final renomeia ele:

 

while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1){
	//aqui ignora e pula para o proximo
	if (strcmp(nome,ctt.nome)==0){
		continue;
	}else {
		//aqui escreve no novo arquivo
		//fwrite...
	}
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom sou muito leigo nesse assunto , estou tentando aqui , por enquanto na função excluir ta assim  , é isso mesmo ? 

 

void excluir(){
	FILE* arquivo;
	CONTATO ctt;
	char procurado[30];
	int ativo=0;
	int posicao =0;
	
	cabecalho();	
	arquivo = fopen("agenda.txt", "ab");
	if (arquivo==NULL){
		printf("Problema na abertura do arquivo!\n");
		
	}
	else{
		fflush(stdin);
		printf("Digite o nome que você quer apagar:\n");
		gets(procurado);
		
		while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1){
			if (strcmp(procurado,ctt.nome)==0){
				fseek(arquivo, posicao*sizeof(CONTATO), SEEK_SET);
				fwrite(&ctt, sizeof(CONTATO),1,arquivo));
			}
			
		}
	}
	fclose(arquivo);
	getch();
}
	
	
}

 

Link para o comentário
Compartilhar em outros sites

@Valiwne 

Use dois arquivos, um você usa para ler os contatos e outro para escrever.

Na hora da escrita, você apenas ignora o cadastro com o nome recebido.

Assim:

void excluir(){
	FILE* arqentrada, arqsaida;
	CONTATO ctt;
	char procurado[30];
	int ativo=0;
	int posicao =0;
	
	cabecalho();	
	arqentrada = fopen("agenda.txt", "ab");  //arquivo onde tem os contatos
	arqsaida = fopen("agenda_nova.txt", "w");//arquivo onde sera salvo os contatos
	if (arqentrada==NULL || arqsaida==NULL){
		printf("Problema na abertura do arquivo!\n");
      	return;
	}
	else{
		fflush(stdin);
		printf("Digite o nome que você quer apagar:\n");
		gets(procurado);
		
		while(fread(&ctt,sizeof(CONTATO),1,arqentrada)==1){
			if (strcmp(procurado,ctt.nome)==0){
				fwrite(&ctt, sizeof(CONTATO),1,arqsaida));
			}
		}
	}
	fclose(arqentrada);
	fclose(arqsaida);
  	//aqui precisa renomear o agenda_nova.txt por agenda.txt
	getch();
	}	
}

 

Link para o comentário
Compartilhar em outros sites

Entendi , estava fazendo o mais difícil haha , como teve muito feriado ultimamente acabei perdendo muitas aulas de algoritmo na faculdade então o professor meio que jogou as aulas to tendo que estudar mais pela internet mesmo então por isso estou muito perdido kkk

 

Uma duvida,esse codigo que você mandou ele não esta com a parte pra ignorar a linha na hora de escrever em outro arquivo né ?ou seja , pra excluir

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Que estranho , ta igual , mas não ta apagando =( olha;

 

void excluir(){
	FILE* arquivo;
	FILE* arqsaida;
	CONTATO ctt;
	char procurado[30];
	
	
	cabecalho();	

	arquivo = fopen("agenda.txt", "ab");
	arqsaida = fopen("agenda_nova.txt", "w");
	if (arquivo ==NULL || arqsaida == NULL){
		printf("Problema na abertura do arquivo!\n");
		return;
	}
	else{
		fflush(stdin);
		printf("Digite o nome que você quer apagar:\n");
		gets(procurado);
		
		while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1){
			if (strcmp(procurado,ctt.nome)==0){
				continue;
			}else{
			fwrite(&ctt, sizeof(CONTATO),1,arqsaida);
		}
			
		}
	}
	
	fclose(arquivo);
	fclose(arqsaida);
  	rename("agenda_nova.txt" , "agenda.txt");
	

	getch();
}
	

 

 

Link para o comentário
Compartilhar em outros sites

@Valiwne Não está renomeando, por que o arquivo ja existe, e la em cima, a agenda precisa ser aberta como leitura:


void excluir(){
	FILE* arquivo;
	FILE* arqsaida;
	CONTATO ctt;
	char procurado[30];


	cabecalho();

	arquivo = fopen("agenda.txt", "rb");
	arqsaida = fopen("agenda_nova.txt", "w");

	if (arquivo ==NULL || arqsaida == NULL){
		printf("Problema na abertura do arquivo!\n");
		return;
	}
	else{
		fflush(stdin);
		printf("Digite o nome que você quer apagar:\n");
		gets(procurado);

		while(!feof(arquivo)){
            fread(&ctt,sizeof(CONTATO),1,arquivo);

			if (strcmp(procurado,ctt.nome)==0){
                printf("Contato encontrado %s!\n",ctt.nome);
                fwrite(NULL, sizeof(CONTATO), 1, arqsaida);
			}else{
			    if(feof(arquivo)) break;
                fwrite(&ctt, sizeof(CONTATO),1,arqsaida);
            }
		}
	}

	fclose(arquivo);
	fclose(arqsaida);

    //remove backup antigo / novo backup / agenda final
    remove("agenda_backup.txt");
  	rename("agenda.txt", "agenda_backup.txt");
  	rename("agenda_nova.txt", "agenda.txt");
	getch();
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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...