我正在尝试使用 C++ 读取 .txt 文件,其中用户输入(在本例中为“用户”和“通行证”)两条信息,当比较它们时,如果两者都存在,则类型为“正确登录”。代码如下:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main(){
ifstream archivo("user.txt");
//Obtencion de datos
cout << "Usuario: ";
char user[25];
cin.getline(user,25,'\n');
cout << "Pass: ";
char pass[25];
cin.getline(pass,25,'\n');
//Creacion de la linea a buscar
char busqueda[100];
strcpy(busqueda, user);
strcat(busqueda, " ");
strcat(busqueda, pass);
char linea[100];
while(!archivo.eof() || busqueda != linea){
for(int i = 0; i!=archivo.eof(); i++){
archivo.getline(linea, 100);
}
}
cout << endl << endl << "LOGIN CORRECTO." << endl << linea;
return 0;
}
问题是,一旦你输入了这两个数据,你就会陷入一个你什么都不做的无限循环中。你可以一直给它一个介绍,它不会从那里出来......
做更多的测试,我得到了以下代码。唯一的问题是它只与文件的第一行进行比较。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
struct registro{
string name;
string second;
string street;
string user;
string pass;
} usuario;
void registroUsuario(){
ofstream archivo("registro.txt");
archivo << "----------------------" << endl;
archivo << "Nombre: " << usuario.name << endl;
archivo << "Apellido: " << usuario.second << endl;
archivo << "Direccion: " << usuario.street << endl;
archivo << "Usuario: " << usuario.user << endl;
archivo << "Password: " << usuario.pass << endl;
archivo.close();
}
void registroLogin(){
ofstream archivo("usuarios.txt");
archivo << usuario.user;
archivo << " ";
archivo << usuario.pass;
archivo << "\n";
archivo.close();
}
bool login(string usuario, string password){
ifstream archivo("usuarios.txt");
string busqueda = usuario + " " + password;
string linea;
while(!archivo.eof()){
getline(archivo, linea);
if(linea == busqueda){
return true;
}
else{
return false;
}
}
}
int main(){
menu:
cout << "\t\t\t *** Base de datos ***" << endl << endl;
cout << "1. Registro de usuario" << endl;
cout << "2. Login" << endl;
cout << "0. Salir" << endl << endl;
cout << "Escoge una opcion: ";
int option;
cin >> option;
cin.ignore();
cout << endl << endl;
system("pause");
switch(option){
case 1:{
system("cls");
cout << "Nombre: ";
getline(cin, usuario.name);
cout << endl << "Apellido: ";
getline(cin, usuario.second);
cout << endl << "Direccion: ";
getline(cin, usuario.street);
cout << endl << endl << "Nombre de usuario: ";
getline(cin, usuario.user);
cout << endl << "Password: ";
getline(cin, usuario.pass);
registroUsuario();
registroLogin();
cout << endl << endl;
system("pause");
goto menu;
break;
}
case 2:{
system("cls");
cout << "Usuario: ";
getline(cin, usuario.user);
cout << endl << "Password: ";
getline(cin, usuario.pass);
if(login(usuario.user, usuario.pass) == true){
goto login;
}
else{
cout << endl << endl << "Login incorrecto.";
goto menu;
}
break;
}
}
login:
cout << endl << endl << endl << "LOGIN CORRECTO";
return 0;
}
无需为此重新发明轮子,您可以将类型对象存储
registro
在std::map
按名称索引的中:我建议您创建一个将记录保存到文件的函数:
另一个读取文件并填写地图
registros
:这样,通过委托给
std::map::find
函数可以很容易地检查用户是否存在并且其密码是否匹配map
:该函数
std::getline
读取完整的行并返回执行读取的流(“流”),该流有一个布尔转换运算符,如果流处于正确状态,将返回真(更多细节在这里)。