Login en C++ con usuario y contraseña

Como crear un login de usuario y contraseña en C++

Un sistema de login nos permite filtrar al usuario a partir de si tiene un usuario y una contraseña en un nuestro archivo, para que este ejemplo sea más sencillo lo haremos con archivos de texto y así nos aseguramos que sea útil para los estudiantes. Con este ejercicio podrá practicar manipulación de archivos, bucles, búsqueda en arreglos y separación de cadenas de texto.


Paso 1: Pedimos al usuario su nombre de usuario y su contraseña y los almacenamos en dos variables



#include <iostream>
#include <conio.h>

string nombre;
string contra;

using namespace std;
int main(){
cout << "Escriba su usuario" << endl;
cin >> nombre;
cout << "Escriba su contraseña" << endl;
cin >> contra;

_getch(); // Pausamos el programa para que no se cierre
}


Paso 2: Abrimos el archivo con la función fstream e incluimos la librería fstream



#include <iostream>
#include <conio.h>
#include <fstream> // Libreria incluida para abrir y leer archivos

using namespace std;

string nombre;
string contra;

int main(){
cout << "Escriba su usuario" << endl;
cin >> nombre;
cout << "Escriba su contraseña" << endl;
cin >> contra;

fstream archivo("datos.txt"); // Abrimos una conexion al archivo y la guardamos en la variable archivo para posteriormente leerlo

_getch();
}


Nota: archivo es el nombre que le pusimos a una variable de tipo fstream ahí están guardados los datos de la conexión al archivo datos.txt, se guardan separados por coma cada línea termina en coma.

Archivo de texto que guarda los datos de cada usuario

Paso 3: Leemos el archivo línea por línea y separamos los datos de cada línea



En este paso se encuentra la parte más compleja, primero leemos el archivo línea por línea, separamos los datos con ayuda del separador coma y comprobamos si el nombre es igual al ingresado por el usuario, de ser así dejamos de buscar en el archivo, aun si la contraseña fuera incorrecta en Paso 4 verificamos que la contraseña también sea correcta.

La función getline() sirve para obtener línea por línea, dentro van dos parámetros, en el primero la conexión al archivo, recordemos que esta conexión se encuentra en la variable que hemos llamado archivo. En el segundo parámetro se encuentra la variable donde enviaremos la línea que acabamos de obtener, a esta variable le llamaremos línea.

La función find() sirve para buscar el texto que coloquemos dentro de los paréntesis, el texto será buscado dentro de la línea que acabamos de obtener tal y como se muestra en el código de abajo, si find() encuentra coincidencias esta función devolverá en numero la posición previa a la posición donde se encuentra el carácter o palabra dentro de la cadena de texto. Por ejemplo, decir que si estoy buscando el carácter h y este es el primero de nuestra cadena entonces me devolverá un 0 en lugar de 1. El valor devuelto por find ha de guardarse en una variable de tipo size_t;

La constante npos está contenida dentro del subespacio de nombres string y por eso se escribe string::npos, npos tiene un numero cuyo tamaño es 4294967295, si el valor devuelto por find() es igual a dicho número, esto significa que no hubieron coincidencias.

La función substr() sirve para dividir una cadena de caracteres a partir de un separador como puede ser una coma, un punto, un espacio en blanco o cualquier carácter que designemos como separador, para este ejemplo estamos usando la coma como separador.

La función erase() sirve para eliminar caracteres dentro de una cadena de texto, la usaremos para eliminar los caracteres que acabamos de guardar desde el inicio hasta la primera coma.

#include <iostream>
#include <conio.h>
#include <fstream>

using namespace std;

string nombre;
string contra;
string linea; // Variable temporal donde se almacenarán usuario y contraseña separados por coma y obtenidos desde el archivo de texto
string arreglo[2]; // Este arreglo servirá para separar el usuario y la contraseña guardándolos en una casilla distinta
size_t pos = 0; // variable que contendrá la posición donde se encuentra la coma que separa el usuario de la contraseña
int contador=0; // Servirá para avanzar en las casillas del arreglo
string dato; // Contendrá temporalmente el usuario o la contraseña mientras se separan
int fin = 0; // Servirá para darle fin a un bucle

int main(){
cout << "Escriba su usuario" << endl;
cin >> nombre;
cout << "Escriba su contraseña" << endl;
cin >> contra;

fstream archivo("datos.txt");

while(getline(archivo,linea)&&fin==0){ // Este bucle se repetira mientras la funcion getline pueda obtener lineas nuevas del archivo txt y la
variable fin valga 0
while ((pos = linea.find(",")) != std::string::npos){ /* Si el valor devuelto por la funcion find es distinto a la constante npos esto
significa que si se ha encontrado lo que se busca dentro de la variable linea */
dato = linea.substr(0, pos); // Separamos los caracteres desde la posicion 0 hasta una posicion previa al caracter separador que es la coma
arreglo[contador]=dato; // Guardamos el dato anterior dentro de la casilla 0 o la 1 dependiendo del valor de contador
linea.erase(0, pos + 1); // Eliminamos los caracteres desde la posicion 0 hasta la posicion donde se encuentra el caracter separador coma,
incluida la coma
contador++; // Aumentamos el valor del contador
}
if (arreglo[0].find(nombre, 0) != string::npos){
fin=1; /* Si el nombre de alguna linea es igual al ingresado por el usuario cambiamos el valor de la variable fin para que se
termine el bucle, sin importar que la contraseña sea incorrecta */

}
contador=0;/* Regresamos el valor del contador a 0 por si en la línea previa no estuviesen el nombre y la contraseña de nuestro usuario, así
continuamos en el bucle buscando hasta que se encuentre o se acaben los datos en el archivo de texto.*/
}

_getch();
}


Paso final: Comparamos los datos obtenidos con los ingresados por el usuario



#include <iostream>
#include <conio.h>
#include <fstream>

using namespace std;

string nombre;
string contra;
string linea;
string arreglo[2];
size_t pos = 0;
int contador=0;
string dato;
int fin = 0;

int main()
{

cout << "Ingrese su usuario" << endl;
cin >> nombre;
cout << "Ingrese su contraseña" << endl;
cin >> contra;

ifstream archivo("datos.txt");

while(getline(archivo,linea)&&fin==0){
while ((pos = linea.find(",")) != std::string::npos){
dato = linea.substr(0, pos);
arreglo[contador]=dato;
linea.erase(0, pos + 1);
contador++;
}
if (arreglo[0].find(nombre, 0) != string::npos){
fin=1;
}
contador=0;
}

/* Revisamos a continuacion si el nombre de usuario y la contraseña son iguales a los ingresados por el usuario de ser asi le dejamos pasar,
le damos un mensaje de bienvenida y realizamos cualquier otra accion que necesitemos*/

if (nombre==arreglo[0]&&contra==arreglo[1]){
cout << "Bienvenido a Codigazo" << endl;
}
else{
cout << "Los datos ingresados son incorrectos" << endl;
}

_getch();
}


Resultado final con el código compilado
Comentarios y preguntas