Ir ao conteúdo
  • Cadastre-se

C Sistema de cadastro de pessoas em C.


izk__

Posts recomendados

Olá, sou novo aqui, estou começando agora meu curso de engenharia de software e preciso desenvolver um sistema de cadastro de pessoas em C.
Infelizmente venho tendo problemas em algumas partes do código e estou aceitando QUALQUER DICA só pra fazer isso funcionar (sério, to desesperado).

 

Problemas:
1) Eu executo o cadastro da pessoa corretamente, mas ao entrar na função consultar_pessoa(), meu programa não reconhece o numero digitado pelo usuario (cpf) como existente, e logo após recebo a mensagem "Cpf não encontrado" 

Alguém poderia me explicar o motivo?

 

2) Preciso criar uma função que lista as pessoas em ordem alfabética por cidade, conseguem me explicar como fazer isso? Foi disponibilizado um arquivo de texto que contem todas as cidades com e sem acento e o uf das cidades respectivamente.

 

obs: tentei utilizar o "Printf()" em algumas partes do código para entender o que exatamente meu programa estava recebendo mas não obtive sucesso.

obs2: pode ser que alguns comentários no meio do código estejam errados ou incompletos pois esse código já foi muito alterado.

 

O resto das funções creio que sejam mais fáceis de resolver, por hora é isso 🙂

O #include "function.c" por enquanto só foi utilizado para incluir uma função de limpar o buffer e a tela, mas também tem uma função que valida o cpf que não usei ainda. 


Código function:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <locale.h>




void limpar_buffer() // Limpar buffer

{

    char ch;

    while ((ch = getchar()) != '\n' && ch != EOF);

}



void limpar_tela()// Limpa terminal

{

    #if defined(linux) || defined(unix) || defined(APPLE)

        system("clear");

    #endif



    #if defined(_WIN32) || defined(_WIN64)

        system("cls");

    #endif

}



int validador_cpf(){



    // Declaração de variaveis

    int soma, resultado, num, cont;

    char digito10, digito11, cpf[11];

    scanf("%s", cpf); // gets usado como scanf para variaveis do tipo char



    // Validar o primeiro digito

    soma = 0;

    for(cont = 0; cont < 9; cont++){

        num = cpf[cont] - 48;

        soma = soma + (num * (10 - cont));

    }

    resultado = 11 - (soma % 11);

   

    if((resultado == 10) || (resultado == 11)){

    digito10 = '0';

    }else digito10 = resultado + 48;



    // Validar o segundo digito

    soma=0;

    for(cont = 0; cont < 10; cont++){

        num = cpf[cont] - 48;

        soma = soma + (num * (11 - cont));

    }

    resultado = 11 - (soma % 11);

    if((resultado == 10) || (resultado == 11))

        digito11 = '0';

        else digito11 = resultado + 48;



    // Comparação entre os cálculos

    if((digito10 != cpf[9]) && (digito11 != cpf[10]))

        return 1;

    else

    return 0;

}

int main();



Código main: 

 

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <stdbool.h>

#include "function.c"



#define TAM_NOME 100 // tamanho max do nome

#define TAM_CPF 11 // tamanho max do cpf

#define TAM_SX 10



bool sair = false; // caso sair seja verdadeiro ele encerra o programa

FILE *arquivo; // declaração do arquivo



typedef struct pessoa { //criação do tipo "pessoa"

    char nome[TAM_NOME];

    char cpf[TAM_CPF];

    int dia;

    int mes;

    int ano;

    char sexo[TAM_SX];

    char cidade[25];

    char ufederal[25];

} PESSOA;




typedef struct cidade { // criação do tipo "cidade"

    char uf[3];

    char nome[100];

    char nome_sem_acento[200];

} CIDADE;




PESSOA pessoa;



void cadastrar_pessoa(){

    limpar_tela(); // limpar o terminal

   

arquivo = fopen("pessoa.txt", "a"); // acrescenta ou cria um arquivo para leitura/escrita denominado "pessoas.txt"

    if(arquivo == NULL){ // if para caso ocorra um erro na abertura

        printf("Erro na abertura do arquivo\n");

        system("pause");

        exit(1);

        }



        limpar_buffer(); // Sempre limpar o buffer antes de escanear uma variavel do tipo char

       // Recebendo os dados
        printf("Digite o CPF: ");

        scanf("%[^\n]", pessoa.cpf);

        printf("%s", pessoa.cpf);

        limpar_buffer();

        printf("Digite o nome: ");

        scanf("%[^\n]", pessoa.nome);

        printf("Digite o dia de nascimento: ");

        scanf("%d", &pessoa.dia);

        printf("Digite o mes de nascimento: ");

        scanf("%d", &pessoa.mes);

        printf("Digite o ano de nascimento: ");

        scanf("%d", &pessoa.ano);

        limpar_buffer();

        printf("Digite o seu sexo: ");

        scanf("%[^\n]", pessoa.sexo);

        limpar_buffer();

        printf("Digite sua cidade: ");

        scanf("%[^\n]", pessoa.cidade);

        limpar_buffer();

        printf("Digite sua unidade de federacao: ");

        scanf("%[^\n]", pessoa.ufederal);

        rewind(arquivo); // Função que retorna para o começo do arquivo

        fprintf(arquivo, "%s %s %d/%d/%d %s %s %s\n", pessoa.nome, pessoa.cpf, pessoa.dia, pessoa.mes, pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal); // Escrevendo o struct pessoa recem cadastrado

        fclose(arquivo); // Fechando arquivo

        system("pause"); // "pressione qualquer tecla para continuar"



}



void consultar_pessoa(){

    // Declarações

    char cpf[TAM_CPF];

    int a=0;

    // Instruções

    limpar_tela();

   

    arquivo = fopen("pessoa.txt", "r"); // abre o arquivo denominado "pessoas.txt" em forma de leitura 

        if(arquivo == NULL){ // if para caso ocorra um erro na abertura

            printf("Erro na abertura do arquivo\n");

            system("pause");

            exit(1);

            }

    limpar_buffer();

    printf("Informe o CPF que deseja pesquisar: ");

    scanf("%s", cpf); // lendo o cpf digitado pelo usuário

    rewind(arquivo); // posicionando o ponteiro no início do arquivo

while (fscanf(arquivo, "%s %s %d/%d/%d %s %s %s", pessoa.nome, pessoa.cpf, &pessoa.dia, &pessoa.mes, &pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal) != EOF) { 

    if (strcmp(pessoa.cpf, cpf) == 0) {

            a++;

            printf("Nome: %s\n", pessoa.nome);

            printf("Data de nascimento: %d/%d/%d\n", pessoa.dia, pessoa.mes, pessoa.ano);

            printf("Cpf: %s\n", pessoa.cpf);

            printf("Sexo: %s\n", pessoa.sexo);

            printf("Cidade: %s\n", pessoa.cidade);

            printf("Unidade de Federacao: %s\n", pessoa.ufederal);

            fclose(arquivo);

            break;

            system("pause");

        }

if(a == 0)printf("Cpf não encontrado\n");

fclose(arquivo);

system("pause");

}

}



void menu(){

    //Declarações

    int op__menu;

    //Instruções

    limpar_tela();

    printf("\n    Menu de opções: \n\n");

    printf("1) Cadastrar Pessoa\n");

    printf("2) Consultar Pessoa\n");

    printf("3) Listar pessoas por Cidade\n");

    printf("4) Gerar relatorio\n");

    printf("5) Excluir Pessoa\n");

    printf("6) Encerrar Programa\n\n");

    printf("Digite o numero da opcao: ");

    scanf("%d", &op__menu);

    switch (op__menu){

        case 1:cadastrar_pessoa(); // procedimento de cadastro de pessoa.

        break;

   

        case 2:consultar_pessoa(); //CONSULTAR_PESSOA

        break;



        case 3://listar_pessoa(); //LISTAR_PESSOAS POR CIDADE

        break;



//essa função não precisa ser feita no momento

        case 4://gerar_relatorio(); //RELATORIO

        printf("Esta funcao ainda não esta pronta.\n");

        sleep(2);

        break;

//essa função não precisa ser feita no momento           

        case 5://excluir(); //EXCLUIR_PESSOA

        printf("Esta funcao ainda não esta pronta.\n");

        sleep(2);

        break;

           

        case 6:sair = true; //ENCERRAR_PROGRAMA

        break;

       

        default:printf("Essa opcao não existe!\n");sleep(1);

        }

}

int main(){

    arquivo = fopen("pessoa.txt", "a+");

    if(arquivo == NULL){

        printf("Erro na abertura do arquivo\n");

        system("pause");

        exit(1);

        }

    fclose(arquivo);

    while(!sair){

        limpar_tela();

        menu();

        }        

    return 0;

}

 

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

O erro de você não conseguir consultar o cadastro estava no "break;" Eu deixei comentado o break e mantive apenas o system("pause");

Eu comentei algumas coisas no seu código, mantendo alguns dos comentários seus que achei pertinente mas apaguei a maioria só para questão de leitura aqui:

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
//#include "function.c" - como eu deixei o código na mesma página, deixei comentado o 'function.c'.
#include <stdbool.h> //incluí isso para poder usar bool


void limpar_buffer()
{
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}


void limpar_tela()
{
    #if defined(linux) || defined(unix) || defined(APPLE)
        system("clear");
    #endif

    #if defined(_WIN32) || defined(_WIN64)
        system("cls");
    #endif
}


int validador_cpf()
{
    int soma, resultado, num, cont;
    char digito10, digito11, cpf[11];

    scanf("%s", cpf); 

    soma = 0;

    for(cont = 0; cont < 9; cont++)
    {
        num = cpf[cont] - 48;
        soma = soma + (num * (10 - cont));
    }

    resultado = 11 - (soma % 11);
    
    if((resultado == 10) || (resultado == 11))
        digito10 = '0';
    else 
        digito10 = resultado + 48;

    soma=0;

    for(cont = 0; cont < 10; cont++)
    {
        num = cpf[cont] - 48;
        soma = soma + (num * (11 - cont));
    }

    resultado = 11 - (soma % 11);

    if((resultado == 10) || (resultado == 11))
        digito11 = '0';
    else 
        digito11 = resultado + 48;

    if((digito10 != cpf[9]) && (digito11 != cpf[10]))
        return 1;
    else
        return 0;
}

#define TAM_NOME 100 //Não precisa dizer que isso é o tamanho do nome, é autoexplicativo
#define TAM_CPF 11 // "      "
#define TAM_SX 10

bool sair = false;

FILE *arquivo;

typedef struct pessoa { 
    char nome[TAM_NOME];
    char cpf[TAM_CPF];
    int dia;
    int mes;
    int ano;
    char sexo[TAM_SX];
    char cidade[25];
    char ufederal[25];
} PESSOA;


typedef struct cidade {
    char uf[3];
    char nome[100];
    char nome_sem_acento[200];
} CIDADE;

PESSOA pessoa;

void cadastrar_pessoa()
{
    limpar_tela(); //autoexplicativo

    arquivo = fopen("pessoa.txt", "a"); // acrescenta ou cria um arquivo para leitura/escrita denominado "pessoas.txt"

    if(arquivo == NULL)
    {
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }

    limpar_buffer(); // Sempre limpar o buffer antes de escanear uma variavel do tipo char

   // Recebendo os dados
    printf("Digite o CPF: ");
    scanf("%[^\n]", pessoa.cpf);
    //printf("%s", pessoa.cpf); - vou ignorar esse print por enquanto, pois está embolando com o próximo.

    limpar_buffer();

    printf("Digite o nome: ");
    scanf("%[^\n]", pessoa.nome);
    
    printf("Digite o dia de nascimento: ");
    scanf("%d", &pessoa.dia);

    printf("Digite o mes de nascimento: ");
    scanf("%d", &pessoa.mes);

    printf("Digite o ano de nascimento: ");
    scanf("%d", &pessoa.ano);

    limpar_buffer();

    printf("Digite o seu sexo: ");
    scanf("%[^\n]", pessoa.sexo);

    limpar_buffer();

    printf("Digite sua cidade: ");
    scanf("%[^\n]", pessoa.cidade);

    limpar_buffer();

    printf("Digite sua unidade de federacao: ");
    scanf("%[^\n]", pessoa.ufederal);

    rewind(arquivo); // Função que retorna para o começo do arquivo
    fprintf(arquivo, "%s %s %d/%d/%d %s %s %s\n", pessoa.nome, pessoa.cpf, pessoa.dia, pessoa.mes, pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal); // Escrevendo o struct pessoa recem cadastrado
    fclose(arquivo); // Fechando arquivo
    system("pause"); // "pressione qualquer tecla para continuar"
}


void consultar_pessoa()
{
    char cpf[TAM_CPF];
    int a=0;

    limpar_tela();

    arquivo = fopen("pessoa.txt", "r"); // abre o arquivo denominado "pessoas.txt" em forma de leitura 

    if(arquivo == NULL)
    {
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }

    limpar_buffer();

    printf("Informe o CPF que deseja pesquisar: ");
    scanf("%s", &cpf); //Aqui eu adicionei '&' antes de 'cpf'
    rewind(arquivo);

    while (fscanf(arquivo, "%s %s %d % d% d %s %s %s", pessoa.nome, pessoa.cpf, &pessoa.dia, &pessoa.mes, &pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal) != EOF) 
    { 
        if (strcmp(pessoa.cpf, cpf) == 0) 
        {
            a++;
    
            printf("Nome: %s\n", pessoa.nome);
            printf("Data de nascimento: %d/%d/%d\n", pessoa.dia, pessoa.mes, pessoa.ano);
            printf("Cpf: %s\n", pessoa.cpf);
            printf("Sexo: %s\n", pessoa.sexo);
            printf("Cidade: %s\n", pessoa.cidade);
            printf("Unidade de Federacao: %s\n", pessoa.ufederal);
    
            fclose(arquivo);
            
            //break; - após o break, qualquer coisa que estava sendo executada, encerra. Esse system("pause") é inútil após o break.
            system("pause");
        }
        if(a == 0)
            printf("Cpf não encontrado\n");
        
        fclose(arquivo);
        system("pause");
    }
}

void menu()
{
    int op__menu;
    limpar_tela();

    printf("\n    Menu de opções: \n\n");
    printf("1) Cadastrar Pessoa\n");
    printf("2) Consultar Pessoa\n");
    printf("3) Listar pessoas por Cidade\n");
    printf("4) Gerar relatorio\n");
    printf("5) Excluir Pessoa\n");
    printf("6) Encerrar Programa\n\n");
    printf("Digite o numero da opcao: ");
    scanf("%d", &op__menu);

    switch (op__menu)
    {
        case 1:
            cadastrar_pessoa(); //autoexplicativo
            break;

        case 2:
            consultar_pessoa(); //autoexplicativo
            break;

        case 3:
            //listar_pessoa(); //LISTAR_PESSOAS POR CIDADE
            break;

        case 4:
            //gerar_relatorio(); //RELATORIO
            printf("Esta funcao ainda não esta pronta.\n");
            sleep(2);
            break;

        case 5:
            //excluir(); //EXCLUIR_PESSOA
            printf("Esta funcao ainda não esta pronta.\n");
            sleep(2);
            break;

        case 6:
            sair = true; //aautoexplicativo
            break;

        default:
            printf("Essa opcao não existe!\n");
            sleep(1);
    }
}

int main()
{
    arquivo = fopen("pessoa.txt", "a+");

    if(arquivo == NULL)
    {
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }

    fclose(arquivo);

    while(!sair)
    {
        limpar_tela();
        menu();
    }        

    return 0;
}


O cadastro e consulta pelo cpf funcionou para mim. As outras funções você ainda precisa terminar.

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

Seu programa tem muitos erros ainda. Alguns são tão comuns que os programas parecem mesmo copiados uns dos outros.
Eu tenho uma lista com 20 a 30 desses "erros" e vou apenas copiar alguns aqui conforme o caso.

 

Sobre seu código

 

Citação

@izk__
1) Eu executo o cadastro da pessoa corretamente, mas ao entrar na função consultar_pessoa(), meu programa não reconhece o numero digitado pelo usuario (cpf) como existente, e logo após recebo a mensagem "Cpf não encontrado" 

Alguém poderia me explicar o motivo?

 

 

Como concluiu que executa o cadastro corretamente se sequer tem uma função que lista todos os registros no arquivo?
 

Citação

@izk__ Preciso criar uma função que lista as pessoas em ordem alfabética por cidade, conseguem me explicar como fazer isso? Foi disponibilizado um arquivo de texto que contem todas as cidades com e sem acento e o uf das cidades respectivamente.


Ajudaria se você tivesse postado o arquivo de cidades ou ao menos umas linhas dele certo: Assim quem achar que pode ajudar tem que além de tudo criar um arquivo de teste e a formatação pode nem a ser a mesma do que está usando.
 

Para listar as pessoas em ordem alfabética pode por exemplo ler o arquivo de entrada e criar um vetor com os nomes das pessoas. E ordenar o tal vetor. E mostrar na tela. Nada mais.
 

Porque postou tudo em espaço duplo? Muito chato importar um programa com tantas linhas em branco.
 

Ainda sobre o código postado
 

Há muitos erros e coisas que simplesmente não são assim ou não deviam ser programadas assim.
 

  • não entendi a razão de ter DOIS arquivos e não 3. E tem um int main() declarado no fim de function.c. Que significa isso?
  •  function.c é um arquivo mas devia ser um header e um arquivo
  •  em main tem outra função main(). Qual o propósito? E em main.c tem um include para function.c. Não é boa ideia. Acho que notou que os outros include que usou são todos para arquivos .h, e deve imaginar que tem uma razão para isso.
  • Não use acentos em nomes de variáveis ou comentários. Evite em strings  a menos que o enunciado exija. Não vai aprender nada e só vai ter problemas
  •  Não use system() para nada. Não estará fazendo nada. Não vai aprender nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer.
  •  main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal.
  •  evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo.
  •   Use alguma ordem em suas funções, como a ordem alfabética por exemplo. Vai gostar disso quando seu programa tiver 50 funções ao invés de umas poucas. Muitos IDE mostram uma lista das funções, em geral na ordem em que foram declaradas, de modo que você pode clicar no nome e o editor vai direto para o código, mas se estiverem em ordem é claro que você só ganha.
  •   Nunca use variáveis globais. Isso é um pesadelo e sempre vai cair na sua cabeça. Em geral é proibido em empresas e escolas. Não declare NADA que use memória  fora de main().
  •   Não declare mais que uma variável por linha. Não acrescenta nada e só dificulta a leitura. Inicialize todas as variáveis.
  •   Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os  testes aí sim incorpore a leitura. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa. Nunca escreva um programa interativo, mesmo que seja o objetivo final.
  •   Alinhe seu código com algum critério. Evite longas linhas com mais de 60 colunas.
  •  Use nomes significativos para as variáveis e fuja de coisas como aux, aux1 e aux2. E não use nomes de variáveis enormes porque em uma expressão fica muito difícil de ler.
  •  Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício.
  •   scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho.
  •   Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Exemplo: para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro '%' --- como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5...
  •   Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem.
  •   Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu.
  •   evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes.
  •  Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento
  •   Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf().
  •   Ao usar uma estrutura de dados como uma lista, uma pilha ou fila entenda que ela é um container e nada tem a ver com os dados. Não misture NUNCA os dados com a estrutura porque só via complicar tudo. Em especial vai ficar muito mais difícil aproveitar a estrutura em outros programas, e essa é toda a razão de escrever um programa.

Alguns exemplos no código das coisas que não estão assim muito boas


 

	void consultar_pessoa()


Isso não é bom. O que você quer é consultar se uma pessoa está registrada no arquivo, a partir de um CPF? É algo provável. Como eu devo ter dito (copiado) nas notas, não use void, é um desastre. Não use globais. É um desastre e proibido em toda parte, escolas e empresas.  Use o simples
 

	int consultar_pessoa(const char* CPF, const char* arquivo)


e retorne 0 se não achou o cara. O simples. E não pergunte NUNCA na função, como eu também copiei acima. Assim vai levar uma eternidade para testar seu programa, ficando parado em frente a tela inventando nominhos e campos.

    if (arquivo == NULL)
    {  // if para caso ocorra um erro na abertura
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }


Qual o sentido de usar exit() em main() se um return vai encerrar o programa igualzinho?
 

   scanf("%s", cpf);  // lendo o cpf digitado pelo usuário


TESTE o retorno de scanf(). É ingênuo seguir às cegas
 

    while (fscanf(
               arquivo, "%s %s %d/%d/%d %s %s %s",
               pessoa.nome, pessoa.cpf, &pessoa.dia,
               &pessoa.mes, &pessoa.ano, pessoa.sexo,
               pessoa.cidade, pessoa.ufederal) != EOF)


Isso não está bom mesmo que corrija, mas NUNCA teste o retorno de scanf() com EOF. Teste com o número de especificadores, no caso 8. É o simples.
 

    printf("\n    Menu de opções: \n\n");
    printf("1) Cadastrar Pessoa\n");
    printf("2) Consultar Pessoa\n");
    printf("3) Listar pessoas por Cidade\n");
    printf("4) Gerar relatorio\n");
    printf("5) Excluir Pessoa\n");
    printf("6) Encerrar Programa\n\n");
    printf("Digite o numero da opcao: ");

Não, nunca. Use o simples
 

	printf("\n\
    Menu de opções:\n\
\n\
  1) Cadastrar Pessoa\n\
  2) Consultar Pessoa\n\
  3) Listar pessoas por Cidade\n\
  4) Gerar relatorio\n\
  5) Excluir Pessoa\n\
  6) Encerrar Programa\n\
\n\
  Digite o numero da opcao: ");


que é centenas de vezes mais rápido pra executar e é muito mais simples de ler e formatar...

 

	int validador_cpf();

 

Não, não escreva assim. Receba o cpf como parâmetro e retorne 0 se seu erro. Apenas zero ''e falso em C. É o esperado:
 

	int validador_cpf(cons char* cpf);

 

E entenda que é um pouco ingênuo testar os dois DV antes de retornar. Se o primeiro não confere qual o propósito de gastar tempo e recursos testando o outro? Simplesmente retorne se não estiver certo já o primeiro...

 

Sugiro incorporar essas coisas em seu programa antes de seguir. Vai perder MUITO menos tempo e aprender algo mais.

 

Vou mostrar o código como postou, com o mínimo de correções para compilar em Windows (mas ainda bem errado).


Deve usar sempre os arquivos com as funções aos pares. A razão deve ficar óbiva ao ler abaixo.

Veja fun.h

#define TAM_NOME 100  // tamanho max do nome
#define TAM_CPF 11    // tamanho max do cpf
#define TAM_SX 10

typedef struct {  // criação do tipo "pessoa"
  char nome[TAM_NOME];
  char cpf[TAM_CPF];
  int dia;
  int mes;
  int ano;
  char sexo[TAM_SX];
  char cidade[25];
  char ufederal[25];
} Pessoa;

typedef struct {  // criação do tipo "cidade"
  char uf[3];
  char nome[100];
  char nome_sem_acento[200];
} Cidade;

void cadastrar_pessoa();
void consultar_pessoa();
void limpar_buffer();
void limpar_tela();
void menu();
int validador_cpf();


e fun.c tem as funções

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#include "fun.h"

extern bool sair;

void cadastrar_pessoa()
{
    Pessoa pessoa;

    limpar_tela();  // limpar o terminal
    FILE* arquivo = fopen(
        "pessoa.txt",
        "a");  // acrescenta ou cria um arquivo para
               // leitura/escrita denominado "pessoas.txt"
    if (arquivo == NULL)
    {  // if para caso ocorra um erro na abertura
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }
    limpar_buffer();  // Sempre limpar o buffer antes de
                      // escanear uma variavel do tipo char
    // Recebendo os dados
    printf("Digite o CPF: ");
    scanf("%[^\n]", pessoa.cpf);
    printf("%s", pessoa.cpf);
    limpar_buffer();
    printf("Digite o nome: ");
    scanf("%[^\n]", pessoa.nome);
    printf("Digite o dia de nascimento: ");
    scanf("%d", &pessoa.dia);
    printf("Digite o mes de nascimento: ");
    scanf("%d", &pessoa.mes);
    printf("Digite o ano de nascimento: ");
    scanf("%d", &pessoa.ano);
    limpar_buffer();
    printf("Digite o seu sexo: ");
    scanf("%[^\n]", pessoa.sexo);
    limpar_buffer();
    printf("Digite sua cidade: ");
    scanf("%[^\n]", pessoa.cidade);
    limpar_buffer();
    printf("Digite sua unidade de federacao: ");
    scanf("%[^\n]", pessoa.ufederal);
    rewind(arquivo);  // Função que retorna para o começo do
                      // arquivo
    fprintf(
        arquivo, "%s %s %d/%d/%d %s %s %s\n", pessoa.nome,
        pessoa.cpf, pessoa.dia, pessoa.mes, pessoa.ano,
        pessoa.sexo, pessoa.cidade,
        pessoa.ufederal);  // Escrevendo o struct pessoa
                           // recem cadastrado
    fclose(arquivo);       // Fechando arquivo
    system("pause");       // "pressione qualquer tecla para
                           // continuar"
}

void consultar_pessoa()
{
    Pessoa pessoa;

    // Declarações
    char cpf[TAM_CPF];
    int  a = 0;
    // Instruções
    limpar_tela();
    FILE* arquivo = fopen(
        "pessoa.txt",
        "r");  // abre o arquivo denominado "pessoas.txt" em
               // forma de leitura
    if (arquivo == NULL)
    {  // if para caso ocorra um erro na abertura
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }
    limpar_buffer();
    printf("Informe o CPF que deseja pesquisar: ");
    scanf("%s", cpf);  // lendo o cpf digitado pelo usuário
    rewind(arquivo);   // posicionando o ponteiro no início
                       // do arquivo
    while (fscanf(
               arquivo, "%s %s %d/%d/%d %s %s %s",
               pessoa.nome, pessoa.cpf, &pessoa.dia,
               &pessoa.mes, &pessoa.ano, pessoa.sexo,
               pessoa.cidade, pessoa.ufederal) != EOF)
    {
        if (strcmp(pessoa.cpf, cpf) == 0)
        {
            a++;
            printf("Nome: %s\n", pessoa.nome);
            printf(
                "Data de nascimento: %d/%d/%d\n",
                pessoa.dia, pessoa.mes, pessoa.ano);
            printf("Cpf: %s\n", pessoa.cpf);
            printf("Sexo: %s\n", pessoa.sexo);
            printf("Cidade: %s\n", pessoa.cidade);
            printf(
                "Unidade de Federacao: %s\n",
                pessoa.ufederal);
            fclose(arquivo);
            break;
            system("pause");
        }
        if (a == 0) printf("Cpf não encontrado\n");
        fclose(arquivo);
        system("pause");
    }
}


void limpar_buffer()  // Limpar buffer
{
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF)
        ;
}
void limpar_tela()  // Limpa terminal
{
#if defined(linux) || defined(unix) || defined(APPLE)
    system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
    system("cls");
#endif
}

void menu()
{

    // Declarações
    int op__menu;
    // Instruções
    limpar_tela();
    printf("\n\
    Menu de opções:\n\
\n\
  1) Cadastrar Pessoa\n\
  2) Consultar Pessoa\n\
  3) Listar pessoas por Cidade\n\
  4) Gerar relatorio\n\
  5) Excluir Pessoa\n\
  6) Encerrar Programa\n\
\n\
  Digite o numero da opcao: ");
    scanf("%d", &op__menu);
    switch (op__menu)
    {
        case 1:
            cadastrar_pessoa();  // procedimento de cadastro
                                 // de pessoa.
            break;
        case 2:
            consultar_pessoa();  // CONSULTAR_PESSOA
            break;
        case 3:  // listar_pessoa(); //LISTAR_PESSOAS POR
                 // CIDADE
            break;
            // essa função não precisa ser feita no momento
        case 4:  // gerar_relatorio(); //RELATORIO
            printf("Esta funcao ainda não esta pronta.\n");
            Sleep(2000);
            break;
            // essa função não precisa ser feita no momento
        case 5:  // excluir(); //EXCLUIR_PESSOA
            printf("Esta funcao ainda não esta pronta.\n");
            Sleep(2000);
            break;
        case 6:
            sair = true;  // ENCERRAR_PROGRAMA
            break;
        default:
            printf("Essa opcao não existe!\n");
            Sleep(1000);
    }
}


int validador_cpf()
{
    // Declaração de variaveis
    int  soma, resultado, num, cont;
    char digito10, digito11, cpf[11];
    scanf("%s", cpf);  // gets usado como scanf para
                       // variaveis do tipo char
    // Validar o primeiro digito
    soma = 0;
    for (cont = 0; cont < 9; cont++)
    {
        num  = cpf[cont] - 48;
        soma = soma + (num * (10 - cont));
    }
    resultado = 11 - (soma % 11);
    if ((resultado == 10) || (resultado == 11))
    {
        digito10 = '0';
    }
    else
        digito10 = resultado + 48;
    // Validar o segundo digito
    soma = 0;
    for (cont = 0; cont < 10; cont++)
    {
        num  = cpf[cont] - 48;
        soma = soma + (num * (11 - cont));
    }
    resultado = 11 - (soma % 11);
    if ((resultado == 10) || (resultado == 11))
        digito11 = '0';
    else
        digito11 = resultado + 48;
    // Comparação entre os cálculos
    if ((digito10 != cpf[9]) && (digito11 != cpf[10]))
        return 1;
    else
        return 0;
}


e main.c tem apenas o esperado: main()

//  https://www.clubedohardware.com.br/forums/topic/
//  1631584-sistema-de-cadastro-de-pessoas-em-c/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fun.h"

bool sair = false;

int main()
{
    FILE* arquivo = fopen("pessoa.txt", "a+");
    if (arquivo == NULL)
    {
        printf("Erro na abertura do arquivo\n");
        system("pause");
        exit(1);
    }
    fclose(arquivo);
    while (!sair)
    {
        limpar_tela();
        menu();
    }
    return 0;
}

 

Alinhado de uma maneira aceita no mercado

 

Escreva em torno dos dados

 

Crie por exemplo um vetor de estruturas, de Pessoa. E no início leia isso para a memória e rode usando ESSES dados. Ao final apenas regrave o arquivo no disco.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!