Ir ao conteúdo
  • Cadastre-se

C Ler arquivos .txt e usar a informação para não repetir cadastro.


Ir à solução Resolvido por sannoy,

Posts recomendados

Olá pessoal, sou novo aqui no fórum. Estou cursando o 2o semestre de ADS na Unip e meu trabalho desse semestre é fazer um sistema para uma clínica médica, a dúvida que eu estou é: Eu preciso ler um arquivo .txt com várias informações guardadas nele, mas eu preciso de uma só para válidar o cadastro do paciente. Para o sistema não efetuar duplo cadastro, eu quero pegar a informação no arquivo .txt, no caso o CPF. Preciso que o sistema leia o arquivo .txt se ele não encontrar o número do CPF já digitado pelo usuário, ele poderá continuar com o cadastro. Caso o número informado pelo usuário já possuir no registro .txt, ele não poderá prosseguir e mostrará que o CPF já está cadastrado. Alguém pode me ajudar com isso? Vou deixar o código aqui embaixo. Também aceito sugestões para deixar o código menor.

 

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


void cadastroPaciente(){
setlocale(LC_ALL, "");

// DADOS DO PACIENTE 



struct cadastro_paciente{
    char nomecompleto[50];
    char datanasc[50];
    char RG[50];
    char CPF[50];
    char telefone[50];
    char email[50];
    char endereco[255];
    char validacar[20];
    char convenio[30];
    char carteirinha[20];


};


int i, dados, retornar;
char fpag = 'P' || 'C';
char formapag[2];
char CPF[20];

FILE *cadastro_paciente;
cadastro_paciente = fopen("cadastro_paciente.txt", "a");
struct cadastro_paciente paciente;


    if(cadastro_paciente == NULL){
        printf("Erro ao abrir o arquivo.");
        };

        printf("Você está na tela de cadastramento de pacientes.\n\n");

        printf("Digite o Nome Completo: ");
        scanf("%s", paciente.nomecompleto);
        fflush(stdin);
        printf("Digite a data de nascimento(EX: DD/MM/AAAA): ");
        scanf("%s", paciente.datanasc);
        fflush(stdin);
        printf("Digite o número do RG: ");
        scanf("%s", paciente.RG);
        fflush(stdin);
        printf("Digite o número do CPF: ");
        scanf("%s", paciente.CPF);
        fflush(stdin);
        printf("Digite o número do Telefone/Celular: ");
        scanf("%s", paciente.telefone);
        fflush(stdin);
        printf("Digite o email: ");
        scanf("%s", paciente.email);
        fflush(stdin);
        printf("Digite o endereço completo(EX: Rua, numCasa - Bairro - Cidade/Estado): ");
        fgets(paciente.endereco, 255, stdin);
        printf("Particular ou Convênio? Informe com P ou C: ");
        scanf("%c", &fpag);
        fpag = toupper(fpag);
        if(fpag == 'P'){
           printf("Digite D para Dinheiro ou C para Cartão.\n");
           printf("Forma de pagamento: ");
           scanf("%s", formapag);
            }else if(fpag == 'C'){
            printf("Nome do Convênio: ");
            scanf("%s", paciente.convenio);
            printf("Digite o número da carteirinha: ");
            scanf("%s", &paciente.carteirinha);
            printf("Data de validade da carteirinha (DD/MM/AAAA): ");
            scanf("%s", paciente.validacar);
            }

        printf("Os dados estão corretos? Digite 1 para SIM ou 2 para NÃO: ");
        scanf("%d", &dados);

        if(dados == 1){
                //SALVANDO OS DADOS EM TXT
            fprintf(cadastro_paciente, "\nDADOS DO PACIENTE CADASTRADO\n");
            fprintf(cadastro_paciente,"Nome Completo: %s\n", paciente.nomecompleto);
            fprintf(cadastro_paciente,"Data de nascimento: %s\n", paciente.datanasc);
            fprintf(cadastro_paciente,"RG: %s\n", paciente.RG);
            fprintf(cadastro_paciente,"CPF: %s\n", paciente.CPF);
            fprintf(cadastro_paciente,"Telefone/Celular: %s\n", paciente.telefone);
            fprintf(cadastro_paciente,"Email: %s\n", paciente.email);
            fprintf(cadastro_paciente,"Endereço: %s", paciente.endereco);
            fprintf(cadastro_paciente,"Convênio ou Particular?: %c\n", fpag);
            fprintf(cadastro_paciente, "Forma de pagamento, Cartão ou Dinheiro: %c\n", formapag);
            fprintf(cadastro_paciente,"Nome do Convênio: %s\n", paciente.convenio);
            fprintf(cadastro_paciente,"Número da Carteirinha: %s\n", paciente.carteirinha);
            fprintf(cadastro_paciente,"Data de validade da carteirinha: %s", paciente.validacar);
            fclose(cadastro_paciente);
            printf("O paciente foi cadastrado com sucesso!\n");
            }else if(dados == 2){
            printf("Os dados não foram cadastrados!\n");
            }

    printf("Voltar ao menu principal? Digite 1 ou para sair digite 0: ");
    scanf("%d", &retornar);
        if(retornar == 1){
            system("cls");
            menuprincipal();
        }else if(retornar == 0){
            exit(0);
        }
}

 

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

@Igor Soares da Paixão  Olá,

Sugestões, Ok... Meu camarada, que dor!! ver está utilização do scanf() seguido de fflush(). Utilize está função como base:

char *
input(char *stgt, int smax){
     FILE *f = stdin;
     int s;
     char *p;
     /* get max bytes or upto a newline */
     for (p = stgt, smax--; smax > 0; smax--) {
         if ((s = fgetc(f)) == EOF)
             break;
         if (s == '\n')
             break;
         *p++ = s;
     }
 
     *p = 0;
     if (p == stgt || s == EOF)
         return NULL;
 
     return (p);
 }

 

Agora você poderia utilizar está função input da seguinte forma:

char variavelDestino[tamanho];
input(variavelDestino,tamanho);

 

E pelo "Santo da Engenharia de Software" se é que o mesmo existe... Remova este monte de fflush(stdin), se quiser, utilize ele desta forma:

fflush(); // Assim ele "flushará"/"limpará" todas as streams abertas

 

Outra utilização de fflush(): (https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rtref/fflush.htm)

FILE *stream;
int ch;
unsigned int result = 0;

stream = fopen("mylib/myfile", "r");
while ((ch = getc(stream)) != EOF && isdigit(ch))
  result = result * 10 + ch - '0';
if (ch != EOF)
  ungetc(ch,stream);

fflush(stream);        /* fflush desfaz o efeito da função ungetc */
printf("The result is: %d\n", result);
if ((ch = getc(stream)) != EOF)
  printf("The character is: %c\n", ch);

 

LEMBRANDO: Se for possível(caso não tenha limitações da universidade) NÃO utilize o scanf() como input de STRINGS para usuários, porque? No MÍNIMO se o usuário passar um valor maior que o do buffer pode causar  um overflow.

 

Espero ter lhe ajudado em algo, até mais!

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

@sannoy Obrigado meu parceiro, foi como eu disse sou estudante e praticamente calouro ainda kkk. O scanf pra ler strings foi um modo que eu vi no youtube. Obrigado pela dica, vou ver se funciona aqui

adicionado 28 minutos depois

@sannoy E quanto a ler uma informação .txt para não repetir um número digitado pelo usuário? Eu quero que o sistema limite um cadastro por CPF, como faço para fazer isso? 

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

6 horas atrás, Igor Soares da Paixão disse:

            fprintf(cadastro_paciente,"Nome Completo: %s\n", paciente.nomecompleto);             fprintf(cadastro_paciente,"Data de nascimento: %s\n", paciente.datanasc);

 

Você está gravando os dados para ler depois. Não entendo para que gravar os títulos como se fosse um relatório. Depois quando for ler vai pular isso tudo? Imaginou o trabalho?

 

Isso em geral se faz assim: no início do programa você procura por um cadastro e se tem você lê todo mundo para um vetor na memória, ou apenas o CPF se forem milhares deles.

 

ao final do programa você grava no disco o arquivo novo, com um nome novo. Muda o nome do antigo para ter chance de voltar atrás se deu m. Aí muda o nome do novo para o nome original.

 

Não deve usar scanf() para ler do teclado. É um inferno.

 

Não use fflush() em arquivos de entrada, como o teclado. Não funciona direito ou sequer funciona. Não é necessário e não é confiável.

 

Não precisa de novas funções de leitura. C já tem várias em stdio.h. Tente o simples: fgets() para ler a linha toda.

 

Leia um livro. Se seu curso não adota um arrume dois. 

 

Aprenda a usar funções. E use. Vai demorar muito menos para escrever seus programas ao fazer isso

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

  • Solução

@Igor Soares da Paixão Para ler utiliza-se o fopen("arquivo","r"), o exemplo que te mostrei acima de outra utilização do fflush(), faz o uso do mesmo.

Já para o processo de tratamento dos dados o @arfneto  já falou, até mais que o necessário. Leia com atenção e estude.
Se tiver mais dúvidas eu outro usuários tentaremos te ajudar, até mais!

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