Jump to content
  • 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

Recommended Posts

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

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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  :)

Share this post


Link to post
Share on other 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..

Share this post


Link to post
Share on other 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)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.