Ir ao conteúdo
  • Cadastre-se

Comparar login e senha a partir de arquivo txt


Xaws

Posts recomendados

35 minutos atrás, Anonymous Programmer disse:

Dessa forma so uma conta é aceita pelo codigo, da forma que apresentei o usuario pode adicionar quantas contas quiser que o programa verificara todas.

 

Não entendi o que quis dizer... Meu programa sempre verifica todas as contas no arquivo, e podem ser adicionadas quantas contas quiser ao arquivo de banco de dados...

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

@Anonymous Programmer  Agora não ta dando erro,mais quando eu registro o usuário e vou logar só da negado

 

 

 Meu código atualmente:
 

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

int main()
{
	volta:
	char * lista_de_contas,login[30] = "\0",senha[30] = "\0";
	int ponteiro_contas = 0,total_contas = 0,arq_tamanho = 0;
	
	struct usuarios_infos{
	char login[30];
	char senha[30];
};
	struct usuarios_infos usuario_comp,usuario_cadastrado;
	char le[100];
	FILE* logs;
	logs = fopen ("contas.db","rb");
	if(logs == NULL)
	{
		logs = fopen ("contas.db","wb");
		goto volta;
	}
	else
	{
	logs = fopen("contas.db","ab");
	printf("Cadastrar usuario: ");
	scanf("%s",login);
	printf("Cadastrar senha: ");
	scanf("%s",senha);
	fprintf(logs,login);
	fprintf(logs,"\n");
	fprintf(logs,senha);
	fprintf(logs,"\n");
	goto start;
	
	start:
	logs = fopen ("contas.db","rb");
	printf("USUARIO: ");
	scanf("%s",&login);
	printf("SENHA: ");
	scanf("%s",&senha);
	memset(&usuario_cadastrado,0,sizeof(struct usuarios_infos));
	memcpy(&usuario_cadastrado.login,&login,strlen(login));
	memcpy(&usuario_cadastrado.senha,&senha,strlen(senha));
		fseek(logs,0,SEEK_END);
		arq_tamanho = ftell(logs);
		rewind(logs);
		lista_de_contas = (char*)malloc (arq_tamanho);
	if(fread(&usuario_cadastrado,1,arq_tamanho,logs) == 0)
    {
    	printf("Falha ao tentar ler contas\n");
    	return 1;
	}
	else
	{
		total_contas = arq_tamanho / sizeof (struct usuarios_infos);
	}
    while(1)
    {
    	memset(&usuario_comp,0,sizeof(struct usuarios_infos));
    	memcpy(&usuario_comp,&lista_de_contas[ponteiro_contas],sizeof(usuarios_infos));
    	if(memcmp(&usuario_cadastrado,&usuario_comp,sizeof(struct usuarios_infos)) == 0)
    	{
    		printf("logado");
    		goto start;
		}
		else
		{
			printf("negado\n");
			goto start;
		}
		fclose(logs);
	free(lista_de_contas);
	}
}
}

 Vou baixar outro compilador pra testar dps...

Link para o comentário
Compartilhar em outros sites

@Xaws

Eu recomendo utilizar o compilador pura GCC e utiliza o notepad++ como IDE, DevC++ é mt bugado, agora o problema esta no seguinte sua struct no total tem 60bytes no total login[30] + senha[30] = 60bytes, portanto a struct dentro do arquivo tem que estar exatamente do mesmo tamanho nem 1byte a menos nem um byte a mais, de qual forma você esta gravando o login e senha dentro do arquivo ? olha o codigo que fiz na louca so pra adicionar os usuarios no arquido .db

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct usuarios_infos{
	char usuario[100];
	char senha[100];
};

void main(){
	struct usuarios_infos contas;
	FILE * wFile;
	wFile = fopen("usuarios.db","ab");
	if(wFile == NULL){
		printf("[F] Falha em abrir o arquivo. \n");
		return;	
	}
	memset(&contas,0,sizeof(struct usuarios_infos));
	printf("**** Inserir novos usuarios **** \n");
	printf("Usuario: ");
	scanf("%s",contas.usuario);
	printf("Senha: ");
	scanf("%s",contas.senha);
	int bytes = fwrite(&contas,1,sizeof(struct usuarios_infos),wFile);
	if(bytes == 0){
		printf("[F] Falha em escrever os dados. \n");
		return;	
	}else{
		printf("[Ok] Usuario gravado com sucesso. \n");	
		fclose(wFile);
	}
}

 

pra gravar as contas tem que ser dessa forma. lembrando sempre que a struct gravada tem que ser igual a struct lida

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

@Anonymous Programmer Sua struct tem 200 bytes, o que não é compatível com os 60 bytes do programa dele.

E você inverteu os parâmetros do fwrite, colocando o size no lugar do count e o count no lugar do size, mas nesse caso coincidentemente gera o mesmo resultado.

http://en.cppreference.com/w/c/io/fwrite

 

int bytes = fwrite(&contas,1,sizeof(struct usuarios_infos),wFile);

 

deveria ser:

 

int bytes = fwrite(&contas,sizeof(struct usuarios_infos),1,wFile);

 

 

Eu postei um programa na página anterior para gerar o arquivo .db e gravar os logins e senhas usando a struct de 60 bytes, que deve ser compatível com o programa do @Xaws .

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

@isrnick o unico defeito que pode ta ocorrendo nesse codigo que enviei tanto para gravar tanto para comparar as contas, é o tamanho dos vetores de login e senha que no codigo de @Xaws esta diferente.

tanto para quem grava tanto para quem lé a quantidade de bytes deve ser igual

 

realmente os valores de fwrite estão invertidos, compilei e funcionou normalmente então nem reparei fui saber agora que você alertou! kkkk valeu

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

@Anonymous Programmer  Dessa forma...
 

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

int main()
{
	volta:
	char * lista_de_contas,login[10] = "\0",senha[10] = "\0";
	int ponteiro_contas = 0,total_contas = 0,arq_tamanho = 0;
	
	struct usuarios_infos{
	char login[10];
	char senha[10];
};
	struct usuarios_infos usuario_comp,usuario_cadastrado;
	char le[100];
	FILE* logs;
	logs = fopen ("contas.db","rb");
	if(logs == NULL)
	{
		logs = fopen ("contas.db","wb");
		goto volta;
	}
	else
	{
	logs = fopen("contas.db","ab");
	printf("Cadastrar usuario: ");
	scanf("%s",usuario_cadastrado.login);
	printf("Cadastrar senha: ");
	scanf("%s",usuario_cadastrado.senha);
	fprintf(logs,usuario_cadastrado.login);
	fprintf(logs,"\n");
	fprintf(logs,usuario_cadastrado.senha);
	fprintf(logs,"\n");
    goto start;


 E pra ler estou fazendo assim...

 

start:
	logs = fopen ("contas.db","rb");
	printf("USUARIO: ");
	scanf("%s",&usuario_cadastrado.login);
	printf("SENHA: ");
	scanf("%s",&usuario_cadastrado.senha);
	memset(&usuario_cadastrado,0,sizeof(struct usuarios_infos));
	memcpy(&usuario_cadastrado.login,&login,strlen(login));
	memcpy(&usuario_cadastrado.senha,&senha,strlen(senha));
		fseek(logs,0,SEEK_END);
		arq_tamanho = ftell(logs);
		rewind(logs);
		lista_de_contas = (char*)malloc (arq_tamanho);
	if(fread(&usuario_cadastrado,1,arq_tamanho,logs) == 0)
    {
    	printf("Falha ao tentar ler contas\n");
    	return 1;
	}
	else
	{
		total_contas = arq_tamanho / sizeof (struct usuarios_infos);
	}
    while(1)
    {
    	memset(&usuario_comp,0,sizeof(struct usuarios_infos));
    	memcpy(&usuario_comp,&lista_de_contas[ponteiro_contas],sizeof(usuarios_infos));
    	if(memcmp(&usuario_cadastrado,&usuario_comp,sizeof(struct usuarios_infos)) == 0)
    	{
    		printf("logado");
    		goto start;
		}
		else
		{
			printf("negado\n");
			goto start;
		}
		fclose(logs);
//	free(lista_de_contas);
	}
}
}

 

Link para o comentário
Compartilhar em outros sites

@Xaws O problema está aqui na hora de salvar os dados no arquivo:

	fprintf(logs,usuario_cadastrado.login);
	fprintf(logs,"\n");
	fprintf(logs,usuario_cadastrado.senha);
	fprintf(logs,"\n");

Você está usando fprintf ao invés de fwrite... Então não está salvando o vetor de chars inteiro no arquivo, apenas a parte contendo a string do login ou da senha (e ainda adicionar um '\n' no final). Isso vai dar problema na hora de ler os dados com fread, pois o fread tenta obter sempre o total de 60 caracteres da sua struct usuarios_infos.

 

fprintf é uma função mais apropriada para ser usada com escrita em arquivo em modo texto, não em modo binário, ou seja usando parâmetros como "a" ou "w" no fopen(), ao invés de "ab" ou "wb". E nesse caso ao invés de usar fread para ler os dados do arquivo deve-se usar funções como fscanf ou fgets.

 

 

Para salvar em modo binário usa-se fwrite, e usa-se fread para ler em modo binário. fwrite salva todos os bits dos dados guardados na variável da sua struct no arquivo, ou seja nesse caso sempre salva 60 caracteres, não importando quantos caracteres tenha cada login ou senha.

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

2 horas atrás, Xaws disse:

@isrnick @Anonymous Programmer  Fiz dessa forma, ta certa ? porque só está dando como negada ainda .-.

 


	fwrite(usuario_cadastrado.login,1,sizeof(usuario_cadastrado.login),logs);
	fwrite(usuario_cadastrado.senha,1,sizeof(usuario_cadastrado.senha),logs);

 

Tecnicamente estão ao contrário as posições do size e do count (no seu caso = 1) na função fwrite(), ou seja você fez a mesma inversão que o @Anonymous Programmer fez no tópico dele pouco acima.

Na dúvida olhe a referência: http://en.cppreference.com/w/c/io/fwrite

 

 

E não há necessidade de gravar login e senha separadamente, você pode salvar os 2 no arquivo com um único fwrite(), chamando uma referência para a variável usuario_cadatrado inteira. Ficando assim:

fwrite(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs);

 

 

E o mesmo é válido na hora de ler do arquivo:

fread(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs);

O fread acima já lê tanto o login quanto a senha (desde que os dados tenham sido salvos corretamente com fwrite).

 

 

A maior vantagem de fazer assim é que você poderia alterar a sua struct usuarios_infos, por exemplo para guardar outras informações sobre o usuário além de login e senha, sem ter que alterar o código que lê e salva dados.

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

3 horas atrás, Xaws disse:

@isrnick  Negado ainda :tw_bawling:

Lembre-se que você tem que recomeçar do início os cadastros no arquivo .db, melhor apagar o arquivo e usar o programa pra gerar um novo, pois os dados salvos de modo errado não são úteis pois não podem ser lidos corretamente.

 

E se esse não é o problema posta como está seu programa agora pra podermos ver o que pode ser.

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

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

int main()
{
	volta:
	char * lista_de_contas,login[10] = "\0",senha[10] = "\0";
	int ponteiro_contas = 0,total_contas = 0,arq_tamanho = 0;
	
	struct usuarios_infos{
	char login[10];
	char senha[10];
};
	struct usuarios_infos usuario_comp,usuario_cadastrado;
	char le[20];
	FILE* logs;
	logs = fopen ("contas.db","rb");
	if(logs == NULL)
	{
		logs = fopen ("contas.db","wb");
		goto volta;
	}
	else
	{
	logs = fopen("contas.db","ab");
	printf("Cadastrar usuario: ");
	scanf("%s",&usuario_cadastrado.login);
	printf("Cadastrar senha: ");
	scanf("%s",&usuario_cadastrado.senha);
	fwrite(&usuario_cadastrado,sizeof usuario_cadastrado,1,logs);
	fclose(logs);
    goto start;
	
	start:
	logs = fopen ("contas.db","rb");
	printf("USUARIO: ");
	scanf("%s",&usuario_cadastrado.login);
	printf("SENHA: ");
	scanf("%s",&usuario_cadastrado.senha);
	memset(&usuario_cadastrado,0,sizeof(struct usuarios_infos));
	memcpy(&usuario_cadastrado.login,&login,strlen(login));
	memcpy(&usuario_cadastrado.senha,&senha,strlen(senha));
		fseek(logs,0,SEEK_END);
		arq_tamanho = ftell(logs);
		rewind(logs);
		lista_de_contas = (char*)malloc (arq_tamanho);
	if(fread(&usuario_cadastrado,arq_tamanho,1,logs) == 0)
    {
    	printf("Falha ao tentar ler contas\n");
    	return 1;
	}
	else
	{
		total_contas = arq_tamanho / sizeof (struct usuarios_infos);
	}
    while(1)
    {
    	memset(&usuario_comp,0,sizeof(struct usuarios_infos));
    	memcpy(&usuario_comp,&lista_de_contas[ponteiro_contas],sizeof(usuarios_infos));
    	if(memcmp(&usuario_cadastrado,&usuario_comp,sizeof(struct usuarios_infos)) == 0)
		{
    		printf("LOGADO COM SUCESSO");
    		break;
		}
		else
		{
			printf("NEGADO\n");
			goto start;
		}
		fclose(logs);
//	free(lista_de_contas);
	}
}
}

@isrnick  Sim eu sempre faço isso, mais não sei porque fica dando negado sempre .-.

Link para o comentário
Compartilhar em outros sites

Tem vários problemas no seu código, a começar pelo uso de lables + gotos, também tem os & nos scanf("%s",&usuario_cadastrado.senha); que não é necessário já que login e senha são vetores, e uns memcpy() que não sei porque estão aí, e o memset() está no lugar errado (deveria ser antes de ler os logins e senhas), etc...

 

Achei melhor reorganizar o código e ir fazendo as correções pra o código funcionar corretamente, e ficou assim:

 

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

int main()
{
    
    int total_contas = 0, arq_tamanho = 0, op = 0, i;

    struct usuarios_infos {
        char login[10];
        char senha[10];
    };

    struct usuarios_infos usuario_cadastrado, *lista_de_contas;
    

    FILE* logs;
    
    while (op != 3){
        printf("\n 1 - Cadastrar nova conta\n");
        printf(" 2 - Fazer login\n");
        printf(" 3 - Sair\n");
        
        printf("\nOpcao: ");
        scanf("%d%*c", &op);

        switch(op){
            case 1:
                logs = fopen ("contas.db","ab");
                if(logs == NULL)
                {
                    printf("\nErro ao tentar abrir o arquivo.\n\n");
                }
                else
                {
                    memset(&usuario_cadastrado,0,sizeof(struct usuarios_infos));
                    printf("Cadastrar usuario: ");
                    scanf("%s", usuario_cadastrado.login);
                    printf("Cadastrar senha: ");
                    scanf("%s", usuario_cadastrado.senha);
                    fwrite(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs);
                    fclose(logs);
                }
                break;
                
            case 2:
                memset(&usuario_cadastrado, 0, sizeof(struct usuarios_infos));
                printf("USUARIO: ");
                scanf("%s", usuario_cadastrado.login);
                printf("SENHA: ");
                scanf("%s", usuario_cadastrado.senha);
                
                logs = fopen ("contas.db","rb");
                if(logs == NULL)
                {
                    printf("\nErro ao tentar abrir o arquivo.\n\n");
                }
                else
                {
                    fseek(logs,0,SEEK_END);
                    arq_tamanho = ftell(logs);
                    total_contas = arq_tamanho / sizeof (struct usuarios_infos);
                    rewind(logs);
                    lista_de_contas = malloc(arq_tamanho);
                    if(fread(lista_de_contas, sizeof usuario_cadastrado, total_contas, logs) != total_contas)
                    {
                        printf("Falha ao tentar ler contas\n");
                        fclose(logs);
                        free(lista_de_contas);
                        return 1;
                    }
                    fclose(logs);
                    for (i=0; i<total_contas; i++){
                        if(memcmp(&usuario_cadastrado, &lista_de_contas[i], sizeof(struct usuarios_infos)) == 0)
                        {
                            printf("\n LOGADO COM SUCESSO\n");
                            break;
                        }
                    }
                    if(i == total_contas)
                    {
                        printf("\n NEGADO\n");
                    }
                    free(lista_de_contas);
                }
                break;
                
            case 3:
                break;
                
            default:
                printf("\n Opcao invalida!\n");
        }
    }
    
    return 0;
}

 

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

42 minutos atrás, Xaws disse:

@isrnick  Você chegou a testar? 
 No meu deu erro,tá difícil kk
:tw_bawling:

er1.png

Testei sim.

 

Esse é um programa em C, mas você salvou num arquivo com extensão .cpp, e o Dev interpreta que se trata de um programa em C++, e usa o compilador do C++ pra compilar, isso pode gerar erros pois algumas coisas do C não funcionam no C++.

 

Arquivos de programas em C devem ser salvos com extensão .c para que o dev use o compilador da linguagem C. Logo salve o código num arquivo com extensão .c e tente novamente.

 

Se isso não funcionar será necessário usar um cast (struct usuarios_infos *) antes do malloc, mas não deveria ser necessário.

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

  • 2 anos depois...

@Anonymous Programmer A sua explicação se encaixaria com o que estou tentando fazer, realizei a criação de um strutc e o cadastro do usuario e coloquei em um arquivo pelo fwrite aberto como "a", porém não estou conseguindo realizar o acesso dos usuários no arquivo criado, fread, até cheguei a criar outro vetor do struct para poder comparar mas mesmo assim não estou conseguindo. 

void acesso ( perfil pessoa2[50] ) {
    system ( "cls" );
    static int i = 0;
    char login[40];
    int senha;
    int len_vet = sizeof(pessoa2) - 1;
    FILE *a;
    a = fopen ( "perfil.qz", "a+" );

    FILE *c;
    c = fopen ( "contador.qz", "w+");

    if ( a == NULL || c == NULL ) {
        printf ( "Erro ao abrir arquivo" );
    } else {
        if ( i < 50 ) {
            fread(&i,40,1,c);
            printf ( "Login: " );
            fflush ( stdin );
            fgets ( login, 40, stdin );
            printf ( "\n" );
            printf ( "Senha: " );
            fflush ( stdin );
            scanf ( "%i", &senha );

            do{
            if ( i < 50 ) {
                for(i = 0; i < len_vet; i++){
                fread(&pessoa2[i], sizeof(perfil), 1, a);
                fclose(a);
                }
            }

            printf ( "%s", pessoa2[i].login );
            printf ( "%i", pessoa2[i].senha );

            }while(strcmp(pessoa2[i].login,login)==0);
        }
    }
    fclose ( a );
    fclose ( c );
}

 

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

@Marcelo Danelon Já pensou em começar com algo menor?

Eu tenho esse código aqui

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


/* Constantes */
#define NOME_ARQUIVO "NSL.ini"

#define T_NOME 10
#define T_SENHA 8

/* Tipos */
typedef struct
{
  char nome[T_NOME];
  char senha[T_SENHA];
}TUsuario;


int main()
{
  TUsuario usuario,temporario;
  char tecla;
  FILE *arquivo=fopen(NOME_ARQUIVO,"rb+");    /* Abre o arquivo para leitura e escrita */
  if(!arquivo)    /* Testa se o arquivo existe */
  {
    arquivo=fopen(NOME_ARQUIVO,"wb+");    /* Cria o arquivo para leitura e escrita */
    if(!arquivo)
    {
      perror("\nNão foi possivel criar nem abrir o arquivo.\n");
      return(-1);
    }
    printf("\nCadastro de usuario\n");
    printf("\n\nDigite o nome do usuario:\t");
    scanf("%[^\n]%*c",usuario.nome);
    printf("\nDigite a senha do usuario:\t");
    scanf("%[^\n]%*c",usuario.senha);
    fwrite(&usuario,sizeof(TUsuario),sizeof(usuario),arquivo);
    if(ferror(arquivo))
    {
      perror("\nErro desconhecido.\n");
      return(-1);
    }
    printf("\nCadastro bem sucedido.\nReinicie o programa para usar o sistema.");
    fclose(arquivo);
    return(0);
  }
  fread(&temporario,sizeof(TUsuario),sizeof(temporario),arquivo);
  do
  {
    printf("\nDigite o login:");
    scanf("%[^\n]%*c",usuario.nome);
    if(strcmp(usuario.nome,temporario.nome)!=0)
    {
      printf("\nUsuario invalido.\n");
      printf("\n\nDigite S/ para sair ou C/ para continuar.\n");
      scanf("%c",&tecla);
      getchar();
      if(toupper(tecla)=='S')
      {
        fclose(arquivo);
        printf("\nPrograma encerrado.\n");
        return(0);
      }
    }
  }while(strcmp(usuario.nome,temporario.nome)!=0);
  printf("\nUsuario aceito.\n");
  do
  {
    printf("\nDigite a senha:");
    scanf("%[^\n]%*c",usuario.senha);
    if(strcmp(usuario.senha,temporario.senha)!=0)
    {
      printf("\nSenha invalida.\n");
      printf("\n\nDigite S/ para sair ou C/ para continuar.\n");
      scanf("%c",&tecla);
      getchar();
      if(toupper(tecla)=='S')
      {
        fclose(arquivo);
        printf("\nPrograma encerrado.\n");
        return(0);
      }
    }
  }while(strcmp(usuario.senha,temporario.senha)!=0);
  printf("\nUsuario logado!\n");
  fclose(arquivo);
  return(0);
}

Não está terminado mas da para entender, ele da um segment fault no final.

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

@Marcelo Danelon Seu programa está abrindo o arquivo a em modo "a+", ou seja em modo de anexação estendido, anexação ocorre no fim do arquivo logo nesse modo o "cursor" do arquivo é posicionado no fim do arquivo, logo não vai ter nada para ler pois já está no fim do arquivo.

 

Nesse caso nem precisa usar modo "a+" pois não vai escrever nada no arquivo, o programa somente lê os dados do aquivo, então deveria abrir em modo de leitura em binário (já que está lendo usando a função fread() ), ou seja deveria usar "rb", e no modo leitura o "cursor" será posicionado no começo do arquivo possibilitando ler os dados do arquivo usando fread().

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

  • 2 anos depois...

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