Я пытаюсь проверить, имеет ли пользователь действительный номер учетной записи и пароль (оба являются целыми) в C++. Данные хранятся в файле.dat с использованием структуры. Это то, что я еще пробовал:
void printIntroMenu();
void printMainMenu();
void start();
void login();
void createAccount();
char menuInput;
int i=0;
struct user{
int user_id;
int password;
}u;
int main()
{
start();
return 0;
}
void start()
{
cout<<"\n\n";
cout<<setw(60)<<" Please select an option from the menu below:";
printIntroMenu();
cin>>menuInput;
switch(menuInput)
{
case 'l': login();
break;
case 'c': createAccount();
break;
case 'q': exit(0);
break;
default: cout<<"\n\n Wrong Choice!! Valid choices are l,c or q.";
start();
}
}
void createAccount()
{
ofstream fout;
fout.open("abc.dat",ios::app|ios::binary);
cout<<setw(60)<<"\n\n Please enter your username (Integer only)";
cin>>u.user_id;
cout<<setw(60)<<"\n\n Please enter your password (Integer only)";
cin>>u.password;
fout<<u.user_id<<'\n'<<u.password<<'\n';
fout.close();
cout<<setw(60)<<"\n Thank You!! Your Account Has Been Successfully Created.";
start();
}
void login()
{
int flag=0;
int uid;
int pass;
ifstream fin("abc.dat",ios::in | ios::binary);
cout<<setw(50)<<"Enter your username: ";
cin>>uid;
cout<<setw(50)<<"Enter your password: ";
cin>>pass;
while(!fin.eof())
{
fin.read((char*)&u,sizeof(user));
if(u.user_id==uid && u.password==pass)
{
flag=1;
cout<<"\n Login Successful!!";
}
else{
cout<<setw(60)<<"*************** LOGIN FAILED! ***************";
start();
}
}
}
Независимо от того, что я вводил в качестве входа в меню входа в систему, я всегда получаю вход с ошибкой в качестве вывода. Скажите, пожалуйста, какие-либо проблемы в структуре хранения данных или извлечения данных из файла или есть что-то, что мне не хватает в коде.
Вы забыли строку для преобразования чисел, потому что это
fin.read((char*)&u,sizeof(user));
не получит вас, что вы хотите, он получает числа из файла в формате char *, а не int.
Это должно быть сделано следующим образом:
fin >> u.user_id;
fin >> u.password;
У вас также должен быть флаг. Если запись отсутствует в первом месте, это может привести к ошибке входа в систему, но запись может существовать во втором месте. Поэтому сохраните переменную флага. Если переменная флага не была обновлена после прохождения по всему файлу, распечатайте "login failed".