Ir ao conteúdo

Posts recomendados

Postado

Olá, pessoas de outro mundo.

Desculpe por atrapalhar seu dia de domingo.

Estou com um problema que simplesmente não consigo resolver.

Eu estava treinando linguagem C e fiz um código para simular um acesso com login e senha. Eu criei um Txt com 3 logins, um em cada linha.

Meu objetivo é: O usuário digita (1) Entrar, então ele digita um login e o programa vai comparar o que ele digitou com cada linha do txt. Caso alguma linha seja igual o que ele digitou, vai pedir a senha.

Quando eu digito a primeira linha, funciona. Mas se eu digitar o conteúdo da segunda ou terceira linha, o programa diz que o login não existe. Sendo que eu sei que existe porque foi eu quem escreveu! ^^'

Meu código é o seguinte:

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


int main()
{
    char login[20];
    char logindigitado[20];
    char logincadastro[20];
    char senha[10];
    char senhadigitada[10];
    int opções,i=2;
    double horas,vendas;

   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t  Digite o numero correspondende a opcao desejada:\n");
   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t(1)Entrar\n");
   printf("\t\t\t\t(2)Cadastrar\n");
   printf("\t\t\t\t(3)Sair\n");
   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t"); scanf("%i",&opções);

    switch(opções)
    {
        case 1:
    system("cls");
   FILE* f;
   f =fopen("login.txt","r");
    printf("\t\t\t\t------------------------------\n");
    printf("\t\t\t\t       Digite seu login:\n");
    printf("\t\t\t\t------------------------------\n");
    printf("\t\t\t\t");scanf("%s",logindigitado);
    while( fgets(login,20,f) != NULL) // O problema está aqui. Quando eu digito o login, só a primeira linha é reconhecida.
    {

        if(strncmp(login,logindigitado,12)==0)
        {
        system("cls");
        printf("\t\t\t\t------------------------------\n");
        printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
        printf("\t\t\t\t------------------------------\n");
        printf("\t\t\t\t");scanf("%s",senhadigitada);
        }
        else if(strncmp(login,logindigitado,12)!=0)
        {

            while ((strncmp(login,logindigitado,12)!=0))
            {

                system("cls");
                printf("\t\t\t\tLogin incorreto. Tente novamente.\n");
                printf("\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t       Digite seu login:\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t");scanf("%s",logindigitado);
            }
            if(strncmp(login,logindigitado,12)==0)
            {
                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t");scanf("%s",senhadigitada);


            }

        }


        fclose(f);
        FILE *s;
        s = fopen("senhas.txt","r");
        while(fgets(senha,10,s)!=NULL)
            fclose(s);
        {
            if(strncmp(senha,senhadigitada,6)==0)
            {
                system("cls");
                printf("\t\t\t\t ------------------------------\n");
                printf("\t\t\t\tCALCULO SALARIAL\n");
                printf("\t\t\t\t ------------------------------\n");

                printf("\t\t\t\tDigite suas horas trabalhadas:\n");
                printf("\t\t\t\t");scanf("%lf",&horas);
                printf("\n");
                printf("\t\t\t\tDigite o valor das vendas feitas:\n");
                printf("\t\t\t\t");scanf("%lf",&vendas);

                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\tO valor do salario de %s: \n",logindigitado);
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t  --->    %.2f    <---",horas*12,5+vendas*1,2);
            }
            else if (strncmp(senha,senhadigitada,6)!=0)
            {
                while(strncmp(senha,senhadigitada,6)!=0)
                {
                       system("cls");
                       printf("\t\t\t\t\Senha incorreta!\n");
                       printf("voce tem %i chances.\n",i);
                       printf("\t\t\t\t------------------------------\n");
                       printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
                       printf("\t\t\t\t------------------------------\n");
                       printf("\t\t\t\t");scanf("%s",senhadigitada);
                       i--;


                      if (i==0)
                      {
                          system("cls");
                          printf("\t\t\t\t---------------------------------------------------\n");
                          printf("\t\t\t\t\t  voce ERROU SUA SENHA 3 VEZES\n");
                          printf("\t\t\t\t SENHA BLOQUEADA. PROCURE UMA AGENCIA PARA AJUDA-LO.\n");
                          printf("\t\t\t\t---------------------------------------------------\n");
                          exit(0);
                      }
                      if(strncmp(senha,senhadigitada,6)==0)
                      {
                        system("cls");
                printf("\t\t\t\t ------------------------------\n");
                printf("\t\t\t\tCALCULO SALARIAL\n");
                printf("\t\t\t\t ------------------------------\n");

                printf("\t\t\t\tDigite suas horas trabalhadas:\n");
                printf("\t\t\t\t");scanf("%lf",&horas);
                printf("\n");
                printf("\t\t\t\tDigite o valor das vendas feitas:\n");
                printf("\t\t\t\t");scanf("%lf",&vendas);

                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\tO valor do salario de %s: \n",logindigitado);
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t  --->    %.2f    <---",horas*12,5+vendas*1,2);
                      }


                }
            }

        }



        }

        break;

        case 2:
            printf("Digite um login para cadastro:\n");
            scanf("%s", logincadastro);
            break;


        case 3:
            printf("Obrigado!! Volte sempre!!\n");
            exit(0);
    }



        return 0;
    }

Desculpem pelo código amador. Fiz um comentário onde acho que é o problema.

Meu arquivo em txt tem duas linhas:

Pablo1234567

Adrielle1783

 

Se eu digito "Pablo1234567", ele pede a senha.

Agora, se eu digito "Adrielle1783" ele diz que o login é incorreto.

Se alguém puder me ajudar, ficarei grato.

Obrigado desde já!

 

  • Obrigado 1
Postado

Tem algo a ver com os ponteiros internos do arquivo. Veja se isso ajuda:

Spoiler

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

int pesquisarNoArquivo(char *nomeArquivo, char *usuario);

int main() {
    char *nomeArquivo = "";  // Coloque o nome do arquivo aqui
    int encontrou = 0;

    encontrou = pesquisarNoArquivo(nomeArquivo, "Rafaela123");
    printf("Encontrou 'Rafaela123'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    encontrou = pesquisarNoArquivo(nomeArquivo, "Larissa");
    printf("   Encontrou 'Larissa'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    encontrou = pesquisarNoArquivo(nomeArquivo, "Larissa321");
    printf("Encontrou 'Larissa321'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    return EXIT_SUCCESS;
}

int pesquisarNoArquivo(char *nomeArquivo, char *usuario) {
    // Pode ler uma linha com 1000 caracteres
    const size_t tamanho = 1000;
    char *linha = (char *) malloc(tamanho * sizeof(char));

    int encontrou = 0;

    FILE *arquivo = fopen(nomeArquivo, "r");

    if (arquivo == NULL) {
        fprintf(stderr, "[ E ]: Arquivo nao encontrado. \n");
        exit(EXIT_FAILURE);
    }

    while (fgets(linha, tamanho, arquivo) != NULL && encontrou == 0) {
        linha[strcspn(linha, "\n")] = '\0';

        encontrou = strcmp(linha, usuario) == 0;
    }

    fclose(arquivo);
    return encontrou;
}

 

 

Meu arquivo está assim:

Spoiler

Rafaela123
Larissa321

 

 

No lugar de ficar abrindo e fechando o arquivo toda hora, você poderia chamar a função 

rewind(arquivo);

antes de fazer a leitura do arquivo. Essa função reseta os ponteiros do arquivo, dessa forma a leitura começará no início do arquivo.

  • Curtir 1
Postado
17 horas atrás, PenseC disse:

int opções,i=2;

 

Seu programa parece muito complicado e difícil de ler, e não acho que precise ser assim

 

  • antes de tudo: NUNCA use acentos em nomes de variáveis. Nem em comentários. Mesmo em constantes, entenda que nada acrescentam e só podem criar problema então se o enunciado não exigir fuja disso.
  • não declare mais de uma variável por linha. É grátis o uso de linhas e encavalar declarações não ajuda em nada
  • inicializa TODAS as variáveis
  • não use variáveis globais com um nome ingênuo como "i". É muito arriscado acabar usando por engano onde não deveria.
  • você tem um livro? um manual? SEMPRE teste o retorno de scanf(). É ingênuo seguir com o programa sem saber se de fato leu algo. No fundo evite ao máximo usar scanf() para ler do teclado. Essa função não foi escrita para isso. Basta ver o nome dela.
  • você sabe escrever funções? Use algumas. Simplifica muito o código

 

Sobre usuario, senha e arquivo

 

O simples em geral é abrir o arquivo de senhas no inicio e fazer algo como preencher dois vetores, usuarios[] e senhas[] e colocar os dados lá. Assim quando o cara digita um usuário você procura na tabela de usuários e ao achar o nome a senha estará na coluna correspondente na tabela de senhas. É muito mais fácil.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!