Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pereira010

Inserir utilizadores, fazer o login e comparar

Mensagens Recomendadas

pereira010

Boas,

Antes de mais não sabia ao certo o que por como assunto.. por isso ficou assim  :thumbsup:

Tenho que fazer um programa tipo twitter, mas assim uma coisa muito simples...

Por exemplo quando o utilizador cria uma nova conta, não poderá criá-la com um username já existente. Então como posso comparar o username que este quer utilizar com os já criados e que estão guardados num ficheiro?

no ficheiro os dados são assim guardados um por linha: "username:password"

a ideia era percorrer todas as linhas do ficheiro certo? como posso fazer isso?

aqui está o código:

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


void inicio();


int com_registo();
char username2[25];
char password2[10];
char user_pass2[35];


int sem_registo();
void intro_user_pass();
char username1[25];
char password1[10];
char user_pass1[35];


int sem_registo()
{
     intro_user_pass();
     
     com_registo();
     
     }


void intro_user_pass()
{
     system("cls");
    
     FILE *fp1;
     fp1 = fopen("utilizadores.txt","a+");
     
     printf("\n\n");
     printf("\t\t ** Twitter**");
     printf("\n\n\n\n");
     
      printf("   -- Faca o registo -- ");
      printf("\n\n");
       
      printf("   ** username: ");
      gets(username1);
      
      printf("   ** password: ");
      gets(password1);
      
      strcat(user_pass1, username1);
      strcat(user_pass1, ":");
      strcat(user_pass1, password1);
      strcat(user_pass1, "\n");
      
      printf("   user_pass: %s", user_pass1);
      
      int cmp; //comparaçao
      cmp = strcmp(user_pass1, user_pass2);
      if( cmp == 0)
      {
          printf("\n\n *** Esses dados ja existem! ***");
          printf("\n *** Faca um novo registo ***");
          printf("\n\n\n\n\n 'Enter' para continuar");
          getchar();
          intro_user_pass();
          }
          
      fprintf(fp1, "%s", user_pass1);
      
      getchar();
     
     fclose(fp1);
     }



int com_registo()
{
    system("cls");
    
    FILE *fp1;
    fp1 = fopen("utilizadores.txt","a+");
    
    rewind(fp1);
    
     printf("\n\n");
     printf("\t\t ** Twitter**");
     printf("\n\n\n\n");
     
      printf("   -- Faca o login -- ");
      printf("\n\n");
      
      printf("   ** username: ");
      gets(username2);
      
      printf("   ** password: ");
      gets(password2);
      
      strcat(user_pass2, username2);
      strcat(user_pass2, ":");
      strcat(user_pass2, password2);
      strcat(user_pass2, "\n");
      
      int cmp2; //comparaçao
      cmp2 = strcmp(user_pass1, user_pass2);
      if( cmp2 != 0)
      {
          printf("\n\n *** Esses dados nao existem! ***");
          printf("\n *** Faca primeiro o registo ***");
          printf("\n\n\n\n\n 'Enter' para continuar");
          getchar();
          sem_registo();
          }
      
      getchar();
      
      fclose(fp1);
}



void inicio()
{
     int escolha1;
     
     twitter:
     printf("\n\n");
     printf("\t\t ** Twitter**");
     printf("\n\n\n\n");
     
     printf("\t Ja se encontra registado? \n");
     printf("\t    1 - Sim\n\t    2 - Nao\n\n\t    0 - Sair");
     
     escolha1 = getch();
     
     switch(escolha1){
                      case '1': com_registo();
                      case '2': sem_registo();
                      case '0': exit(1);
                      default: system("cls"); goto twitter;
                      }
                      
}



main ()
{
     /*
     //declaraçao e abertura dos ficheiros
       FILE *fp1,*fp2, *fp3;
       fp1 = fopen("utilizadores.txt","a+");
       fp2 = fopen("mensagem.txt","a+");
       fp3 = fopen("seguidores.txt","a+");
     */
       inicio();     
     
     
     }
     

cumprimentos,

pereira010

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KiNgPiTo

Algo básico seria:

FILE *fp;
char linha[200];

fp = fopen("ficheiro.txt","r");
   
while(fgets(linha,200,fp))
{

  // Aqui lês a linha... Usa o strtok para separar pelo ":" e compara com o utilizador e com a password inseridas...

}
fclose(fp);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Também podes usar a função sscanf com uma expressão regular simples para extrair os valores da string lida através do fgets:

#include <stdio.h>

int main(void) {
        char str[1024], username[20], password[20];
        FILE *fp = fopen("twitter.txt","r");
        while (fgets(str,sizeof(str),fp)) {
                sscanf(str,"%[^:]:%s",username,password);
                printf("%s\t%s\n",username,password);
        }
        fclose(fp);
        return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pereira010

muito obrigado pessoal! :)

só mais uma coisa...

aqui no meu código, quando faço o programa correr como um ciclo, ou seja, que só fecha se o utilizador quiser a minha variavel user_pass1 quando eu introduza um user que nao existe e a comparação feita dá != 0 (strcmp != 0) assim que o programa volta ao inicio para pedir novamente o login ao introduzir novos valores à variavel user_pass1 aparecem sempre uns simbolos antes e assim a comparação não é feita devidamente...

fica do género.. 'ý²'user_pass1

como posso evitar isso?

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


void login();


void menu();

void mostrar_util();

void acrescentar_rel();


void retirar_rel();


void escre_mensagem();


void ler_mensagem();
                      
                      
                      

void login()
{
    system("cls");
    
    FILE *fp1;
    fp1 = fopen("utilizadores.txt","r");
    
    char username1[25];
    char password1[10];
    char user_pass1[35];
    char user_pass2[35];
    int cmp;
    int y;
    
    printf("\n\n");
    printf("\t\t ** Twitter**");
    printf("\n\n\n\n");
     
    printf("   -- Faca o login -- ");
    printf("\n\n");
    
    printf("   ** username: ");
    gets(username1);
    
    printf("   ** password: ");
    gets(password1);
    
    strcat(user_pass1, username1);
    strcat(user_pass1, ":");
    strcat(user_pass1, password1);
    strcat(user_pass1, "\n");    
    
    user_pass1 [ strlen(user_pass1) -1] = 0;
    printf("\nfgets user1 **%s**\n", user_pass1);
    
    for(int y=0;fgets(user_pass2,35,fp1)!= NULL; y++)
    {
    
    user_pass2 [ strlen(user_pass2) -1] = 0;
    
    cmp = strcmp(user_pass1, user_pass2);
        
    if(cmp==0)
    {
    printf("\n\nLogin verificado");
    getchar();
    menu();
    }
    }

    printf("\n\n\tEsses dados nao existem\n\t'Enter' para continuar");
    getchar();
    login(); //                                       claro que posso tirar isto.. mas como posso resolver este meu problema ?? 
}




void menu()
{
     int escolha2;
     
     menu:
     printf("\n\n");
     printf("\t\t ** Twitter**");
     printf("\n\n\n\n");
     
     printf("\t Menu \n");
     printf("\t    1 - Mostar utilizadores seguidos\n\t    2 - Acrescentar relacoes\n\t    3 - Retirar relacoes\t    4 - Escrever
Mensagem\n\t    5 - Ler mensagem\n\n\t    0 - Sair");
     
     escolha2 = getch();
     
     switch(escolha2){
                      case '1' : mostrar_util();
                      case '2' : acrescentar_rel();
                      case '3' : retirar_rel();
                      case '4' : escre_mensagem();
                      case '5' : ler_mensagem();
                      case '0' : exit(1);
                      default: system("cls"); goto menu;
                      }
}




void mostrar_util()
{
     printf("\t Mostrar utilizadores seguidos \n");
     getchar();
     menu();
}


void acrescentar_rel()
{
     printf("\t Acrescentar relacoes \n");
     getchar();
     menu();
}


void retirar_rel()
{
     printf("\t Retirar relacoes \n");
     getchar();
     menu();
}


void escre_mensagem()
{
     printf("\t Escrever Mensagem \n");
     getchar();
     menu();
}


void ler_mensagem()
{    
     printf("\t Ler Mensagem \n");
     getchar();
     menu();
}



main()
{
      login();
      
      printf("main");
      getchar();
}

cumprimentos  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pereira010

como uso isto:

sscanf(str,"%[^:]:%s",username,password);

mas agora em vez dos : com o \n?

num ficheiro tenho assim:

user

mensagem

e queria separa-los para poder usar o 'user'

ps: como faço para por a cena do código em C, só sei por isto (code)(/code).. com parêntesis rectos.. eu sei..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

como uso isto:

sscanf(str,"%[^:]:%s",username,password);

mas agora em vez dos : com o \n?

num ficheiro tenho assim:

user

mensagem

e queria separa-los para poder usar o 'user'

Não podes porque o fgets pára de ler a string quando encontra o '\n'. Para isso fazes 2 fgets, no 1º lês o user e no 2º a mensagem.

ps: como faço para por a cena do código em C, só sei por isto (code)(/code).. com parêntesis rectos.. eu sei..

[ code=c ][ /code ]

(sem os espaços)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.