#c #registration
#c #Регистрация
Вопрос:
моя программа регистрации и входа в систему столкнулась с несколькими проблемами во время вывода :
- Я должен зарегистрировать нового пользователя и сначала пройти (даже если у меня уже есть предыдущие имена пользователей и пароли, сохраненные в текстовом файле, из которого я пытаюсь его извлечь), после этого только я могу войти в систему, используя предыдущее имя пользователя и пароли, и это повторяется после того, как я закрою окно отладки и снова начну отладку (если япри непосредственном выборе входа в систему после запуска программы будет выведено «неверное имя пользователя или пароль»)
- при выходе из системы с новым зарегистрированным именем пользователя программа переходит к int main() И ОТОБРАЖАЕТ «1. Регистрация ….» но при выходе из системы с предыдущих имен пользователей он переходит к void login () и отображает «Имя пользователя:»
* примечание: последняя функция еще не завершена, но я думаю, что это на нее не влияет (?) (программа работала нормально до того, как я добавил void accountPage()
tho) * я не должен использовать указатели, плюс я очень новичок в c
код немного длинный, но в нем просто много простых функций, я был бы очень признателен, если кто-нибудь где-нибудь укажет на мою ошибку
#include <iomanip>
#include <cctype>
#include <fstream>
#include <string>
using namespace std;
//Global Variables
int Choice1;
int mobile, ic;
string user, pass, name, inUser, inPass;
//Function Prototypes
void register_user();
void login();
void bookRoom();
bool CheckCredentials(string, string);
void accountPage();
int main()
{
cout << "Welcome to Cozy Homes!n";
cout << "Operating hours: 11am - 10pm Tuesday - Sundaynnnn";
do {
cout << "n1. Registern";
cout << "2. Log Inn";
cout << "3. Exitn";
cout << "Please enter a number:";
cin >> Choice1;
if (Choice1 == 1)
{
register_user();
}
else if (Choice1 == 2)
{
login();
}
else if (Choice1 == 3)
{
cout << "Exiting now...n";
return 0;
}
else if (Choice1 < 1 || Choice1 > 3)
{
cout << "Please choose a number from the menu!" << endl;
}
} while (Choice1 != 3);
system("pause");
return 0;
}
//Register page
void register_user()
{
cin.ignore();
cout << "nnn" << "New Username: ";
getline(cin, user);
cout << endl;
cout << "New Password: ";
getline(cin, pass);
cout << endl;
cout << "Full name: ";
getline(cin, name);
cout << endl;
cout << "Mobile Number: ";
cin >> mobile;
cout << endl;
cout << "Ic Number (without " - "): ";
cin >> ic;
cout << endl;
cout << "Registered Successfully!" << endl;
cout << endl;
//Store username and password in login file
ofstream l("login.txt", ios::app);
if (!l.is_open()) {
cout << "could not open file n";
}
l << user << " " << pass << endl;
l << endl;
l.close();
//Store other details in customer file
ofstream c("customer.txt", ios::app);
if (!c.is_open()) {
cout << "could not open file n";
}
c << user << endl;
c << pass << endl;
c << name << endl;
c << mobile << endl;
c << ic << endl;
c << 'n';
c.close();
}
//Log in page
void login()
{
do
{
cout << "nUsername: ";
cin >> inUser;
cout << "Password: ";
cin >> inPass;
if (CheckCredentials(inUser, inPass) == true)
{
cout << "nLogin sucessful!" << endl;
cout << "Welcome, " << inUser << endl;
cout << endl;
accountPage(); // Redirects user to their account page after successfully logged in
}
else
cout << "nInvalid username or password. " << endl;
} while (CheckCredentials(inUser, inPass) != true);
}
//Validate their username and password
bool CheckCredentials(string inUser, string inPass)
{
string u;
string p;
bool status = false;
ifstream f;
f.open("login.txt");
if (!f.is_open())
{
cout << "Unable to open file!n";
}
else if (f)
{
while (!f.eof())
{
f >> u >> p;
if (inUser == u amp;amp; inPass == p)
{
status = true;
}
else
{
status = false;
}
}
}
f.close();
return status;
}
//Account Page
void accountPage()
{
int Choice2;
do
{
cout << "1. Profilen";
cout << "2. Book a Roomn";
cout << "3. Cancel Bookingn";
cout << "4. Logoutn";
cout << "Please enter a number: ";
cin >> Choice2;
if (Choice2 == 1)
{
}
else if (Choice2 == 2)
{
}
else if (Choice2 == 3)
{
}
else if (Choice2 == 4)
{
cout << "Logging out.....nnnn";
cout << endl;
}
} while (Choice2 != 4);
}
//Booking page
void bookRoom() {
cout << " ";
}
```
Комментарии:
1. что упущено в функции register ? У вас еще нет значения для user и pass при записи в файл. Должен сказать, странное упражнение
2. @PhilipStuyck пропуск все еще существует? теперь я отредактировал код, вы видите добавленный код?
3. в цикле первый цикл while неверен. В этот момент, если вы начинаете с новой программы, inuser и inpass пусты. Вам нужен цикл do while.
4.
do { cout << "nUsername: "; cin >> inUser; cout << "Password: "; cin >> inPass; if (CheckCredentials(inUser, inPass) == true) { cout << "nLogin sucessful!" << endl; cout << "Welcome, " << inUser << endl; cout << endl; accountPage(); // Redirects user to their account page after successfully logged in } else cout << "nInvalid username or password. " << endl; } while (CheckCredentials(inUser, inPass) != true);
нравится это? потому что я пробовал это, но столкнулся с теми же проблемами5. Я не собираюсь это читать. Но все равно неправильно
Ответ №1:
Вот так :
void login()
{
bool loggedin = false;
while(!loggedin)
{
cout << "nUsername: ";
cin >> inUser;
cout << "Password: ";
cin >> inPass;
if (CheckCredentials(inUser, inPass) == true)
{
loggedin = true;
cout << "nLogin sucessful!" << endl;
cout << "Welcome, " << inUser << endl;
cout << endl;
accountPage(); // Redirects user to their account page after successfully logged in
}
else
cout << "nInvalid username or password. " << endl;
}
}
или вот так:
void login()
{
bool loggedin = false;
do
{
cout << "nUsername: ";
cin >> inUser;
cout << "Password: ";
cin >> inPass;
if (CheckCredentials(inUser, inPass) == true)
{
loggedin = true;
cout << "nLogin sucessful!" << endl;
cout << "Welcome, " << inUser << endl;
cout << endl;
accountPage(); // Redirects user to their account page after successfully logged in
}
else
cout << "nInvalid username or password. " << endl;
}
while(!loggedin)
}
Поскольку это школьное задание, я не стал самостоятельно тестировать код.
Это просто предназначено для того, чтобы помочь вам в дальнейшем, и я внес только минимальные изменения.
Суть вашей ошибки в том, что неисправная функция вызывает checkcredentials перед вводом пользователя и пароля в систему.
Если это решит вашу проблему, пожалуйста, отметьте как решение.
l << user << " " << pass << endl;
l << endl; <---- creates an empty line in your file. Is this intentional ?
l.close();
Очевидно, что в вашей программе больше ошибок. Но это поможет вам продвинуться дальше.
Теперь я должен делать свою собственную работу 😉
Комментарии:
1. Я попробовал это, и только последнее имя пользователя и пароль могут быть прочитаны и проверены. есть ли ошибка smtg с моим
void CheckCredentials()
?2. похоже на то. Я думаю, что есть даже ошибка в функции register. для многих есть endl. откройте файл в редакторе. И используйте отладчик или используйте больше операторов cout, где вы выводите что-то, что показывает, где вы находитесь и каково значение некоторых переменных. Сделайте это в checkcredentials, чтобы найти вашу проблему.
3. Лучше читать целые строки в readcredentials. и сделайте небольшой синтаксический анализ, чтобы получить пользователя и пароль. Не уверен, что ваш код делает с endl.
4. okk Сначала я устраню неполадки, спасибо за помощь