Desenvolva um programa computacional que solicite ao usuário nome completo e CPF de 3 pessoas. Como é um programa com dados pessoais, esse programa deve ser capaz de:
a. Gravar um arquivo com nome: “Dados_Pessoais.bin”, em binário, com todos os dados fornecidos.
b. Leia o arquivo binário, quando requisitado pelo usuário do programa, apresentando os nomes e CPFs na tela.

Passo 1

O enunciado pede um programa que gerencie dados pessoais (nome completo e CPF) de três pessoas, guardando tudo num arquivo binário chamado “Dados_Pessoais.bin” e permitindo, a partir de uma opção do usuário, gravar novos dados ou ler e exibir os dados já gravados. Para resolver isso em C, vamos usar uma struct para armazenar cada pessoa, funções de entrada e saída de arquivo em modo binário (fwrite e fread) e um menu simples em main.

Passo 2

Definimos uma estrutura para guardar cada registro de pessoa, com espaço fixo para nome e para CPF. Usamos arrays de char para simplificar a leitura com fgets e garantir tamanho máximo:
typedef struct {
    char nome[100];
    char cpf[15];
} Pessoa;

Passo 3

Implementamos a função gravarDados() que abre o arquivo em modo binário de escrita ("wb"), solicita ao usuário os dados de três pessoas (usando fgets e retirando o \n final) e faz fwrite de cada registro. Ao final, fecha o arquivo.
void gravarDados() {
    FILE *fp = fopen("Dados_Pessoais.bin", "wb");
    if (!fp) {
        printf("Erro ao abrir o arquivo para escrita.\n");
        return;
    }
    Pessoa p;
    for (int i = 0; i < 3; i++) {
        printf("Pessoa %d\n", i+1);
        printf("  Nome completo: ");
        fgets(p.nome, sizeof(p.nome), stdin);
        p.nome[strcspn(p.nome, "\n")] = '\0';
        printf("  CPF (somente dígitos): ");
        fgets(p.cpf, sizeof(p.cpf), stdin);
        p.cpf[strcspn(p.cpf, "\n")] = '\0';
        fwrite(&p, sizeof(Pessoa), 1, fp);
    }
    fclose(fp);
    printf("Dados gravados em Dados_Pessoais.bin\n");
}

Passo 4

Implementamos a função lerDados() que abre o mesmo arquivo em modo binário de leitura ("rb"), faz fread em laço até o fim de arquivo, e imprime cada registro lido. Ao final, fecha o arquivo.
void lerDados() {
    FILE *fp = fopen("Dados_Pessoais.bin", "rb");
    if (!fp) {
        printf("Erro ao abrir o arquivo para leitura ou o arquivo não existe.\n");
        return;
    }
    Pessoa p;
    int i = 1;
    while (fread(&p, sizeof(Pessoa), 1, fp) == 1) {
        printf("Registro %d\n", i++);
        printf("  Nome: %s\n", p.nome);
        printf("  CPF:  %s\n", p.cpf);
    }
    fclose(fp);
}

Passo 5

No main(), apresentamos um menu que pede ao usuário escolher entre gravar dados, ler dados ou sair. Usamos um switch para chamar gravarDados() ou lerDados() conforme a escolha, e repetimos até o usuário optar por sair.
int main() {
    int opcao;
    do {
        printf("\nMenu:\n");
        printf("1. Gravar dados\n");
        printf("2. Ler dados\n");
        printf("3. Sair\n");
        printf("Escolha uma opção: ");
        if (scanf("%d%*c", &opcao) != 1) {
            printf("Entrada inválida.\n");
            return 1;
        }
        switch (opcao) {
            case 1:
                gravarDados();
                break;
            case 2:
                lerDados();
                break;
            case 3:
                printf("Encerrando.\n");
                break;
            default:
                printf("Opção inválida.\n");
        }
    } while (opcao != 3);
    return 0;
}

Resposta

#include <stdio.h>
#include <string.h>

typedef struct {
    char nome[100];
    char cpf[15];
} Pessoa;

void gravarDados() {
    FILE *fp = fopen("Dados_Pessoais.bin", "wb");
    if (!fp) {
        printf("Erro ao abrir o arquivo para escrita.\n");
        return;
    }
    Pessoa p;
    for (int i = 0; i < 3; i++) {
        printf("Pessoa %d\n", i+1);
        printf("  Nome completo: ");
        fgets(p.nome, sizeof(p.nome), stdin);
        p.nome[strcspn(p.nome, "\n")] = '\0';
        printf("  CPF (somente dígitos): ");
        fgets(p.cpf, sizeof(p.cpf), stdin);
        p.cpf[strcspn(p.cpf, "\n")] = '\0';
        fwrite(&p, sizeof(Pessoa), 1, fp);
    }
    fclose(fp);
    printf("Dados gravados em Dados_Pessoais.bin\n");
}

void lerDados() {
    FILE *fp = fopen("Dados_Pessoais.bin", "rb");
    if (!fp) {
        printf("Erro ao abrir o arquivo para leitura ou o arquivo não existe.\n");
        return;
    }
    Pessoa p;
    int i = 1;
    while (fread(&p, sizeof(Pessoa), 1, fp) == 1) {
        printf("Registro %d\n", i++);
        printf("  Nome: %s\n", p.nome);
        printf("  CPF:  %s\n", p.cpf);
    }
    fclose(fp);
}

int main() {
    int opcao;
    do {
        printf("\nMenu:\n");
        printf("1. Gravar dados\n");
        printf("2. Ler dados\n");
        printf("3. Sair\n");
        printf("Escolha uma opção: ");
        if (scanf("%d%*c", &opcao) != 1) {
            printf("Entrada inválida.\n");
            return 1;
        }
        switch (opcao) {
            case 1:
                gravarDados();
                break;
            case 2:
                lerDados();
                break;
            case 3:
                printf("Encerrando.\n");
                break;
            default:
                printf("Opção inválida.\n");
        }
    } while (opcao != 3);
    return 0;
}

Exercícios relacionados