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.

Passo 1

O enunciado pede para estender um programa que já manipula um arquivo de pessoas (Nome e CPF), adicionando duas funcionalidades:
  1. Inserir um novo registro (Nome e CPF) ao final do arquivo;
  2. 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:
  1. Abrir o arquivo em modo append ("a");
  2. Ler do usuário o Nome e o CPF;
  3. Gravar no arquivo com fprintf em uma linha (por exemplo, separados por vírgula);
  4. Fechar o arquivo.

Passo 3

Para remover um registro pelo CPF a estratégia clássica é:
  1. Abrir o arquivo original em modo leitura ("r") e um arquivo temporário em modo escrita ("w");
  2. Ler cada linha do arquivo original, extrair o CPF e comparar com o CPF alvo;
  3. Se for diferente, copiar essa linha para o arquivo temporário; se for igual, descartar (e.g. “remover”);
  4. Após processar todas as linhas, fechar os dois arquivos;
  5. 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:
  1. Inserir nova pessoa
  2. Remover pessoa por CPF
  3. Sair
    Cada opção chama a função correspondente (inserir() ou remover()), 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;
}

Exercícios relacionados