Inclua, no programa anterior (exercício 5), as seguintes funcionalidades:
a. Uma opção para que o usuário digite o Nome e CPF a serem inseridos no final do arquivo;
b. A remoção de uma pessoa pelo CPF.
a. Uma opção para que o usuário digite o Nome e CPF a serem inseridos no final do arquivo;
b. A remoção de uma pessoa pelo CPF.
Passo 1
O enunciado pede para estender um programa que já manipula um arquivo de pessoas (Nome e CPF), adicionando duas funcionalidades:
- Inserir um novo registro (Nome e CPF) ao final do arquivo;
- Remover um registro existente pelo CPF.
O conteúdo principal é I/O de arquivos em C e gerenciamento de lista em arquivo (append e remoção via arquivo temporário).
Passo 2
Para inserir um registro ao final do arquivo vamos:
- Abrir o arquivo em modo append (
"a"
); - Ler do usuário o Nome e o CPF;
- Gravar no arquivo com
fprintf
em uma linha (por exemplo, separados por vírgula); - Fechar o arquivo.
Passo 3
Para remover um registro pelo CPF a estratégia clássica é:
- Abrir o arquivo original em modo leitura (
"r"
) e um arquivo temporário em modo escrita ("w"
); - Ler cada linha do arquivo original, extrair o CPF e comparar com o CPF alvo;
- Se for diferente, copiar essa linha para o arquivo temporário; se for igual, descartar (e.g. “remover”);
- Após processar todas as linhas, fechar os dois arquivos;
- Apagar o arquivo original e renomear o temporário para o nome original.
Passo 4
Integramos essas rotinas num menu com loop em
main()
, permitindo ao usuário escolher entre:- Inserir nova pessoa
- Remover pessoa por CPF
- Sair
Cada opção chama a função correspondente (inserir()
ouremover()
), até que o usuário escolha sair.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARQ "pessoas.txt"
#define TMP "pessoas_tmp.txt"
void inserir() {
char nome[100], cpf[15];
printf("Digite o Nome: ");
// lê até a quebra de linha
fgets(nome, sizeof(nome), stdin);
nome[strcspn(nome, "\n")] = '\0'; // remove '\n'
printf("Digite o CPF: ");
fgets(cpf, sizeof(cpf), stdin);
cpf[strcspn(cpf, "\n")] = '\0';
FILE *f = fopen(ARQ, "a");
if (!f) {
perror("Erro ao abrir arquivo para inserir");
return;
}
// gravamos no formato: Nome,CPF\n
fprintf(f, "%s,%s\n", nome, cpf);
fclose(f);
printf("Pessoa inserida com sucesso!\n");
}
void remover() {
char cpf_alvo[15];
printf("Digite o CPF a ser removido: ");
fgets(cpf_alvo, sizeof(cpf_alvo), stdin);
cpf_alvo[strcspn(cpf_alvo, "\n")] = '\0';
FILE *f = fopen(ARQ, "r");
if (!f) {
perror("Erro ao abrir arquivo original");
return;
}
FILE *t = fopen(TMP, "w");
if (!t) {
perror("Erro ao criar arquivo temporário");
fclose(f);
return;
}
char linha[200];
int encontrou = 0;
while (fgets(linha, sizeof(linha), f)) {
// cada linha: Nome,CPF\n
char *sep = strchr(linha, ',');
if (!sep) continue;
// extrai CPF da linha
char cpf[15];
strcpy(cpf, sep+1);
cpf[strcspn(cpf, "\n")] = '\0';
// compara
if (strcmp(cpf, cpf_alvo) == 0) {
encontrou = 1;
// pula esta linha (não grava em t)
} else {
fputs(linha, t);
}
}
fclose(f);
fclose(t);
if (!encontrou) {
printf("CPF não encontrado. Nada removido.\n");
// apaga temporário, mantém original
remove(TMP);
} else {
// substitui original pelo temporário
remove(ARQ);
rename(TMP, ARQ);
printf("Pessoa com CPF %s removida com sucesso!\n", cpf_alvo);
}
}
int main() {
int opc;
do {
printf("\n--- MENU ---\n");
printf("1) Inserir nova pessoa\n");
printf("2) Remover pessoa por CPF\n");
printf("3) Sair\n");
printf("Escolha uma opcao: ");
if (scanf("%d", &opc) != 1) {
// limpa entrada em caso de erro
while (getchar() != '\n');
opc = 0;
}
getchar(); // consome '\n' após o número
switch (opc) {
case 1:
inserir();
break;
case 2:
remover();
break;
case 3:
printf("Encerrando programa.\n");
break;
default:
printf("Opcao invalida. Tente novamente.\n");
}
} while (opc != 3);
return 0;
}