• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nadya

Sistema login

11 mensagens neste tópico

Boas!

Estou aqui com uma pequena duvida, estou a fazer um projecto em que tenho que guardar num ficheiro os dados de login de um user, tipo username/password.

Para guardar tudo bem basta concatenar as strings com /.

E para le-las de novo? o username consigo assim : 

while(!file.eof()) {

file.getline(buffer,100);

user=strtok(buffer,"/");

}

E a password como faço?

Desculpem mas já estou ...  :wallbash:

Thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

   while(!file.eof()) {
      file.getline(buffer,100);
      user=strtok(buffer,"/");
      pass=strtok(NULL,"/"); /* apanha o "token" seguinte */
      }

Edit http://www.cplusplus.com/reference/clibrary/cstring/strtok.html

não te esqueças de validar o resultado dos strtok.

   while(!file.eof()) {
      file.getline(buffer,100);
      user=strtok(buffer,"/");
      if (user != NULL) {
         pass=strtok(NULL,"/"); /* apanha o "token" seguinte */
         if (pass != NULL) {
            /* faz o que tens a fazer */
         } else {
            /* erro?: password não encontrada */
         }
      } else {
         /* erro: impossível "tokenizar" o buffer */
      }
      }

Edit 2: Com o código de cima a password não pode ter o caracter "/".

Se quiseres que a password seja tudo desde o primeiro "/" até ao fim da linha, substitui o delimitador por nada

/*...*/
         pass=strtok(NULL,""); /* apanha o resto da linha */
/*...*/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigada!!!

Já funciona, pensei que ao usar user=strtok(buffer,"/"); ao colocar NULL em vez de buffer ele nao iria ler nada!!

Thanks!!! :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O NULL na chamadas ao strtok indica que é para continuar com o parse da string anterior. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora o problema é que quando inicializo char * user, o compilador dá bad ptr  :)

bool Sistema::checkLogin(string username_,string password_)
{
ifstream file;
char * user;
char * pass;
char buffer[100];
//converter as strings em char *
char * user_=stringToChar(username_);
char * pass_=stringToChar(password_);

file.open("utilizadores.txt");
if(file.is_open()){
while(!file.eof()) { 
	file.getline(buffer,100); 
	user=strtok(buffer,"/");     // char * strtok ( char * str, const char * delimiters );
	if (user != NULL) {        
		pass=strtok(NULL,"/"); /* apanha o "token" seguinte */    
		if (pass != NULL) { 
			if(strcmp(user,user_)==0 && strcmp(pass,pass_)==0){
				return true;		
			}else
				return false;
		}else return false;
	}else return false;
}
}else{addAdministrador("admin","admin","Administrador");}

file.close();
delete[] user_;  
delete[] pass_;
}

Peço desculpas se estou a fazer algo de muito estupido, mas estou a começar agora nisto.

Obrigada! :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que a função stringToChar faz?

Suponho que essa função cria um espaço de memória para converter a std::string num char[].

Isso está a ser bem feito?

Um ponto relativo ao teu código: há alturas em que não fazes o file.close nem o delete[] porque passas por um return (fora do sítio).

Outra coisa: não há maneira de fazeres o que queres sem teres de usar char*, somente com coisas da biblioteca do C++ -- eu não sei C++ suficiente para me responder :)

Tás a misturar muito C com C++ (se calhar não há outra maneira)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao usando só c++

Para colocar dentro de um ficheiro in_file<<nome<<username<<password.

e dentro do ficheiro irá aparecer alfo do genero administradoradminadmin.

Se eu depois fizer in_file>>nome>>username>>password existe alguma forma de ele ler os dados? sem ser da forma como estou a fazer?

O que fiz foi gravar os utilizadores dentro de um ficheiro tipo administrador/admin/admin, depois para ler e verificar desconcateno e verifico ...

Devo estar a fazer algo muito estupido não?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A std::string tem muitas funções que deve ser possível usar para o que queres

http://www.cplusplus.com/reference/string/string/

http://www.cplusplus.com/reference/string/string/find.html

É claro que tens que delimitar o nome/username/password com alguma coisa!

Ao leres o ficheiro, deve ser possível converter para as variáveis isoladas usando as funções do std::string.

E não precisas de andar com char*, new[] e delete[] para trás e para a frente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tinhas razao!

agora trabalhei só com strings e é muito mais facil  :-[

bool Sistema::checkLogin(string username_,string password_)
{
string user, pass;
ifstream file;
file.open("utilizadores.txt");
if(file.is_open())
{
	file >> user >> pass;
	if(user==username_){
		if (pass==password_)
			return true;	
	}
return false;
}else{addAdministrador("admin","admin");}

file.close();
}

Thanks  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT : Problema resolvido ... o if estava mal feito  :wallbash:

-----------------------------------

Desculpem voltar a chatear ... mas so agora voltei a pegar no projecto ... este codigo que fiz só lê uma linha de do ficheiro ... como posso resolver? Como faço para ele pesquisar linha a linha?

Obrigado

0

Partilhar esta mensagem


Link 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