Validação de usuario/senha em Binario?

1. Validação de usuario/senha em Binario?

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 14/01/2017 - 11:15h

Estou desenvolvendo um trabalho do curso em Binario, e em uma das partes do trabalho tem que fazer a validação do usuario/senha que foi cadastrado dentro de um arquivo .bin ou .txt (preferencia .bin). Eu tentei usar "strncmp" apontando uma a variavel onde foi digitada o usuario e comparando com o arquivo .bin e só esta retornando 1. Alguem poderia me ajudar com esse problema?
Agradeço desde já.


  


2. Re: Validação de usuario/senha em Binario?

Bruno Thomaz
SarusKant

(usa CentOS)

Enviado em 14/01/2017 - 18:22h

Boa tarde,
Problema esta com pressionar o enter que gera um break lines junto a string.
No Linux: \n
No Windows: \r\n
Retire esses caracteres do fim de sua string, que resolvera sua validação.

Boa Sorte!
--
Bruno Thomaz


3. RE:

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 15/01/2017 - 03:16h

Na verdade acho que não é bem isso, eu nao to conseguindo usar/apontar o strncmp no arquivo binario, eu teria que colocar o conteudo do binario em uma variavel talvez?


4. Re: Validação de usuario/senha em Binario?

Bruno Thomaz
SarusKant

(usa CentOS)

Enviado em 15/01/2017 - 03:52h

Crie uma estrutura.

typedef struct {
int id;
char * login;
char * senha;
} logon;

Coloque ela no arquivo binário.
Lembre dos descritores.

fopen("file.bin","w+b"); // Criar, Abrir, Zerar, Escrever.
fopen("file.bin","rb"); // Abrir, Ler
fwrite(&var,sizeof(var),sizeof(logon),fp) //Escrever.
fread(&var,2048,sizeof(logon),fp) // Carregar conteúdo binário na memoria.

Ai é só fazer suas comparações, mas lembre sobre o break line que comentei acima.

Boa Sorte!
--
Bruno Thomaz


5. RE:

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 15/01/2017 - 09:02h

Muito obrigado, consegui resolver aqui. Usei o strcmp com 2 variavel auxiliares para comparar com as da struct, aqui deu certo, só nao to conseguido encaixar um else(caso o usuario/senha estiver errado) acho que esta dando conflito com o while.

                      printf("Digite o Usuario: ");
fflush(stdin);
gets(vusuario);

printf("Digite a Senha: ");
fflush(stdin);
scanf("%i", &vsenha);

fp = fopen("atv.bin","r");

while(ret==1){

ret = fread(&x,sizeof(menu),1,fp);
if(ret==1){

if(ret == 1){

if(strcmp(vusuario,x.usuario)==0 && (vsenha == x.senha) ){
printf("Usuario e Senha correto");
}
}
}
}



6. Re: Validação de usuario/senha em Binario?

Bruno Thomaz
SarusKant

(usa CentOS)

Enviado em 15/01/2017 - 11:52h


if(strcmp(vusuario,x.usuario)==0 && (vsenha == x.senha) ){
printf("Usuario e Senha correto");
} else {
printf("Usuario ou Senha inválidos");
}

--
Bruno Thomaz


7. RE:

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 15/01/2017 - 13:53h

SarusKant escreveu:


if(strcmp(vusuario,x.usuario)==0 && (vsenha == x.senha) ){
printf("Usuario e Senha correto");
} else {
printf("Usuario ou Senha inválidos");
}

--
Bruno Thomaz


Acabei descobrindo que com 1 usuario cadastrado ele faz a autenticação normal assim, se tiver 2 ou mais usuarios cadastrado no .bin a autenticação falha e acaba saindo os dois printf "Usuario e Senha correto Usuario ou Senha inválidos"
Oque pode ser?



8. Re: Validação de usuario/senha em Binario?

Bruno Thomaz
SarusKant

(usa CentOS)

Enviado em 15/01/2017 - 19:15h

Boa tarde,
Primeiro, você esta trabalhando com binário, por isso deve abrir o arquivo para escrever e ler sempre com a opção "b" junto. ex. w+b, rb.
Segue o meio correto para seu programa.

typedef struct {
int id;
char * login;
char * senha;
} logon; //Estrutura mestra da base de dados.

logon db[10]; //Espaço para 10 logins alocados na base de dados.
logon session; //Estrutura alocada quando login efetuado com sucesso.
int id,i; // ID que deve ser alocado no cadastro do login como um indice.
char * login, *senha; //Login e senha capturados do stdin (informados pelo usuário);

do {
login; //Capturado do STDIN;
senha; //Capturado do STDIN;
for(i=0; i<(sizeof(db) / sizeof(logon)); i++) { //Comparador para todas as posições da base de dados, para ver se é existente ou não o login e senha informados pelo usuário.
if(strcmp(login,db[i].login)==0 && strcmp(senha,db[i].senha)==0) {
puts("Usuário e senha corretos! Login...\r\n");
session = db[i]; //Alocação da Estrutura de sessão, para informar que o login foi efetivado com sucesso.
break;
}
}
if(session.id<1) // Informativo para login e senha invalidos, caso a sessão não conter o id de algum login.
puts("Usuário ou senha inválidos!\r\n");
} while (session.id<1) // Começar o looping do zero se login e senha for inválidos.

O erro era que não estava percorrendo o vetor da base de dados, para ver se existia este usuário e senha.
também suas condições estão incorretas.
Tente com essas que informei.

Boa Sorte!
--
Bruno Thomaz


9. RE:

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 16/01/2017 - 03:54h

SarusKant escreveu:

Boa tarde,
Primeiro, você esta trabalhando com binário, por isso deve abrir o arquivo para escrever e ler sempre com a opção "b" junto. ex. w+b, rb.
Segue o meio correto para seu programa.

typedef struct {
int id;
char * login;
char * senha;
} logon; //Estrutura mestra da base de dados.

logon db[10]; //Espaço para 10 logins alocados na base de dados.
logon session; //Estrutura alocada quando login efetuado com sucesso.
int id,i; // ID que deve ser alocado no cadastro do login como um indice.
char * login, *senha; //Login e senha capturados do stdin (informados pelo usuário);

do {
login; //Capturado do STDIN;
senha; //Capturado do STDIN;
for(i=0; i<(sizeof(db) / sizeof(logon)); i++) { //Comparador para todas as posições da base de dados, para ver se é existente ou não o login e senha informados pelo usuário.
if(strcmp(login,db[i].login)==0 && strcmp(senha,db[i].senha)==0) {
puts("Usuário e senha corretos! Login...\r\n");
session = db[i]; //Alocação da Estrutura de sessão, para informar que o login foi efetivado com sucesso.
break;
}
}
if(session.id<1) // Informativo para login e senha invalidos, caso a sessão não conter o id de algum login.
puts("Usuário ou senha inválidos!\r\n");
} while (session.id<1) // Começar o looping do zero se login e senha for inválidos.

O erro era que não estava percorrendo o vetor da base de dados, para ver se existia este usuário e senha.
também suas condições estão incorretas.
Tente com essas que informei.

Boa Sorte!
--
Bruno Thomaz


Refiz a opção do modo como você falou acima e ficou assim:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct {
int id;
char usuario[50];
int senha;
char email[50];



}menu; // estrutura mestra


int main () {

menu db[10]; //Espaço para 10 logins alocados na base de dados.
menu session; //Estrutura alocada quando login efetuado com sucesso.
int id,i; // ID que deve ser alocado no cadastro do login como um indice.
FILE *fp;
menu x;
char *usuario, *senha; //Login e senha capturados do stdin (informados pelo usuário);


else if(opcao == 2) {

char vusuario[50]; //
char vemail[50]; // Variaveis auxiliares que eu estava usando antes para pegar do usuario as inforamações
int vsenha; // E comparar com a do .bin

printf("Digite o Usuario: "); // Pegando o usuario
fflush(stdin);
gets(usuario);

printf("Digite a Senha: "); // Pegando a Senha
gets(senha);

fp = fopen("atv.bin","rb");

do {
usuario;
senha;
for (i=0; i<(sizeof(db) / sizeof(menu)); i++ ) {
if(strcmp(vusuario,db[i].usuario)==0 && strcmp(vsenha,db[i].senha)==0) {
puts("Usuario e Senha correto");
session = db[i];
break;
}
}
if(session.id<1)
puts("Usuario ou senha invalido");
} while (session.id <1);
fclose(fp);
}


Eu tentei modificar varias vezes e sempre acaba com erro, na hora de pegar o Login/Senha ou de verifica-los no IF do While






10. RE:

Joao Oliveira
raizoku

(usa Ubuntu)

Enviado em 16/01/2017 - 11:02h

SarusKant escreveu:

Bom dia,
Esta aqui seu problema.

if(strcmp(vusuario,db[i].usuario)==0 && strcmp(vsenha,db[i].senha)==0)

Seu campo senha é do tipo inteiro, função strcmp é somente para caracteres, faça assim.

if(strcmp(vusuario,db[i].usuario)==0 && atoi(vsenha)==db[i].senha)

Também realize este tratamento, retire o breakline.

int i=0;
while(vsenha[i]) {
if(vsenha[i]==(char)13)
vsenha[i] = '\0';
i++;
}
i=0;
while(vusuario[i]) {
if(vusuario[i]==(char)13)
vusuario[i] = '\0';
i++;
}

Provável que isso resolva, seu problema.
--
Bruno Thomaz


Fiz os testes primeiramente assim, só alterando o strcmp como você citou encima, o código nao apresentou erros, porem parece nao ter entrado no if, compilei e executei para testar e não deu nenhuma resposta.

else if(opcao == 2) {

char vusuario[50];
char vemail[50];
int vsenha;

printf("Digite o Usuario: ");
fflush(stdin);
gets(vusuario);

printf("Digite a Senha: ");
scanf("%i", &vsenha);

fp = fopen("atv.bin","rb");

do {
vusuario;
vsenha;
for (i=0; i<(sizeof(db)/sizeof(menu)); i++ ) {
if(strcmp(vusuario,db[i].usuario)==0 && atoi(vsenha)==db[i].senha){
puts("Usuario e Senha correto");
session = db[i];

}
}
if(session.id<1)
puts("Usuario ou senha invalido");
} while (session.id <1);
fclose(fp);
}



Testei o tratamento no lugar do break, deu o seguinte erro "[Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast", testei transformando a senha para um char igual o usuario, funcionou só que tambem não deu nenhum resultando igual o código acima.


else if(opcao == 2) {

char vusuario[50];
char vemail[50];
int vsenha;

printf("Digite o Usuario: ");
fflush(stdin);
gets(vusuario);

printf("Digite a Senha: ");
scanf("%i", &vsenha);

fp = fopen("atv.bin","rb");

do {
vusuario;
vsenha;
for (i=0; i<(sizeof(db)/sizeof(menu)); i++ ) {
if(strcmp(vusuario,db[i].usuario)==0 && atoi(vsenha)==db[i].senha){
puts("Usuario e Senha correto");
session = db[i];
int i=0;
while(vsenha[i]) {
if(vsenha[i]==(char)13)
vsenha[i] = '\0';
i++;
}
i=0;
while(vusuario[i]) {
if(vusuario[i]==(char)13)
vusuario[i] = '\0';
i++;
}

}
}
if(session.id<1)
puts("Usuario ou senha invalido");
} while (session.id <1);
fclose(fp);
}







11. Re: Validação de usuario/senha em Binario?

Bruno Thomaz
SarusKant

(usa CentOS)

Enviado em 16/01/2017 - 11:21h

Opa, testei e aprovei, havia mais erros no seu código.

menu db[10]; //Espaço para 10 logins alocados na base de dados.
menu session; //Estrutura alocada quando login efetuado com sucesso.
int id,i,j; // ID que deve ser alocado no cadastro do login como um indice.
FILE *fp;
menu x;
char *usuario, *senha; //Login e senha capturados do stdin (informados pelo usuário);
usuario = (char *) malloc(sizeof(char)*50+1);
senha = (char *) malloc(sizeof(char)*50+1);

Criação da base de dados com o conteúdo faça assim.

fp = fopen("atv.bin","w+b");
fwrite(&db,sizeof(db),sizeof(menu),fp);
fclose(fp);

Aqui esta o programa.

else if(opcao == 2) {
do {
printf("Digite o Usuario: "); // Pegando o usuario
fflush(stdin);
fgets(usuario,sizeof(usuario),stdin);

printf("Digite a Senha: "); // Pegando a Senha
fgets(senha,sizeof(senha),stdin);
j=0;
while(senha[j]) {
if(((int)senha[j])==10)
senha[j] = '\0';
j++;
}
j=0;
while(usuario[j]) {
if(((int)usuario[j])==10)
usuario[j] = '\0';
j++;
}
fp = fopen("atv.bin","rb");
fread(&db,sizeof(db),sizeof(menu),fp);
for (i=0; i<(sizeof(db) / sizeof(menu)); i++ ) {
if(strcmp(usuario,db[i].usuario)==0 && atoi(senha)==db[i].senha) {
puts("Usuario e Senha correto");
session = db[i];
break;
}
}
if(session.id<1)
puts("Usuario ou senha invalido");
fclose(fp);
} while (session.id <1);
}

Testa ai.

Att
--
Bruno Thomaz






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts