1
resposta

CRUD em C problema com comparações de dados no Login

Estou programando uma aplicação em C (CRUD) e preciso fazer cadastro de usuário e login. O cadastro eu consegui fazer!
O problema é quando tenho que comparar o conteúdo já salvo no arquivo com o que o usuário acabou de digitar.
Como posso resolver isso? Já tentei várias formas e nada de dar certo, alguém pode me dar um help?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

#define ARQ "Dados.dat" /* arquivo com os dados*/
#define OP_SAIR '0'
#define OP_INSERIR '1'
#define OP_LOGIN '2'
#define OP_LISTAR '3'

char *menuMain[]={
  "1. Cadastro",
  "2. Login",
  "3. Listar registros",
  "0. Sair",
  NULL /* ACABARAM AS OPÇOES*/
};

FILE *fp; /*variavel global pois é util ao longo do programa*/

typedef struct{ //Estrutura para cadastro de funcionários
  char usuario[30+1];
  char senha[30+1];
}Pessoa;

typedef struct{ //Requisição de usuário e senha para login
  char req_usuario[30+1];
  char req_senha[30+1];
}Entrada;

void Ler_Usuario(Pessoa *p){ //Aqui ele vai ler o usuário e senha de cada funcionário no arquivo
  printf("Username: "); gets(p->usuario);
  printf("Password: "); gets(p->senha);
  fflush(stdin);
}

char Menu(char *opcoes[]){ //Necessário para selecionar as opções do menu
  int i;
  char ch;
  while(1){
  for(i=0; opcoes[i]!=NULL; i++)
  printf("\t\t%s\n\n",opcoes[i]);

  printf("\n\n\t\tOpcao: ");
  ch = getchar(); fflush(stdin);
  for(i=0; opcoes[i]!= NULL; i++)
  if(opcoes[i][0]==ch)
  return ch;
  }
}

void Cadastro_Usuario(){ //Método responsável pelo cadastro de usuários
  Pessoa x;
  Ler_Usuario(&x);
  Adiciona_Usuario(x);
}


void Adiciona_Usuario(Pessoa p){
  fseek(fp, 0L, SEEK_END);
  if(fwrite(&p, sizeof(p), 1, fp)!=1)
  Mensagem("Adicionar usuário: Falhou a escrita do registro");
}

/*Exibe uma mensagem na tela*/
void Mensagem(char *msg){
  printf(msg);
  getchar();
}

void Inic(){
  fp= fopen(ARQ, "r+b"); //tentar abrir
  if(fp==NULL){
  fp = fopen(ARQ, "w+b"); // criar o arquivo
  if(fp==NULL){
  printf(stderr," Erro fatal: impossivel criar arquivo de dados\n");
  exit(1);
  }
  }
}

/*Mostra na tela os dados existentes no registro*/
void Mostrar_Usuario(Pessoa p){
  printf("Usuário: %s | Senha: %s\n",p.usuario, p.senha);
}

void Listar(){ //Listar registros

  long int n_Linhas = 0;
  Pessoa reg;
  rewind(fp);
  while(1){
  if(fread(&reg, sizeof(reg), 1, fp)!= 1)break; /*Sair do laco*/
  Mostrar_Usuario(reg);
  n_Linhas++;
  if(n_Linhas%20==0)
  Mensagem("Pressione <Enter> para continuar .  .  .");
  }
  Mensagem("\n\n Pressione <Enter> para continuar .  .  ."); /*No fim da listagem*/
}

void Validacao(){

  //Comparação do conteúdo do arquivo com o que foi digitado pelo usuário

  Exibir();
}

void Exibir(){
  printf("Bem vindo!");
}

void Login(){
  Validacao();
}


// -------------------------------------- PRINCIPAL ---------------------------------------- //
void main(int arg) //Método pricipal
{
  char opcao;
  Inic();
  while((opcao = Menu(menuMain))!= OP_SAIR){
  switch(opcao){

  case OP_INSERIR: Cadastro_Usuario(); break;
  case OP_LOGIN: Login(); break;
  case OP_LISTAR: Listar(); break;
  }
  }
}

//É nesse "método" que preciso fazer a comparação do conteúdo do arquivo com o que o usuário acabou de digitar pelo prompt de comando.

void Validacao(){

  //Comparação do conteúdo do arquivo com o que foi digitado pelo usuário

  //Caso a operação de comparação seja verdadeira, o "metodo" exibir é chamado.
  Exibir();
}
1 resposta

Olá William. Eu consegui implementar utilizando partes do seu código para pegar os usuários do arquivo e para pegar o que o usuário digitou. A unica parte que inclui foi a do if, que utilizei a função strcmp para comparar a entrada do usuário com o que tinha no arquivo.

if(!strcmp(x.usuario,reg.usuario) && !strcmp(x.senha,reg.senha)){
        validado = 1;
        break;
    }

O código final ficou assim:

void Validacao(){
  Pessoa x;
  Ler_Usuario(&x);  
  int validado = 0;
  long int n_Linhas = 0;
  Pessoa reg;
  rewind(fp);
  while(1){
    if(fread(&reg, sizeof(reg), 1, fp)!= 1)break; /*Sair do laco*/
    if(!strcmp(x.usuario,reg.usuario) && !strcmp(x.senha,reg.senha)){
        validado = 1;
        break;
    }
    n_Linhas++;
  }
  if(validado)
    Exibir();
  else
    printf("Erro");
}

Também tive que incluir um getchar() nessa parte do código porque ele ficava pegando o Enter e me impedindo de conseguir digitar o nome de usuário, mas não sei se você está tendo esse problema, estou usando Ubunto. (tentei usar a função fflush(stdin); , mas ela não resolveu pra mim.)

void Ler_Usuario(Pessoa *p){ //Aqui ele vai ler o usuário e senha de cada funcionário no arquivo
  getchar();
  printf("Username: "); gets(p->usuario);
  printf("Password: "); gets(p->senha);
  fflush(stdin);
}

E William parabéns pelo código, muito bem organizado e comentado, continue assim. Espero ter ajudado, bons estudos.