我正在尝试创建一个创建新用户的程序。 将需要用户名和密码来创建此新用户。 如果用户名存在于文本文件中,程序将提示“存在现有用户名,并将被要求键入另一个用户名” 用户名和密码将存储在文本文件中。
假设我的文本文件(userandPassword)已经具有以下用户名和密码
用户名密码
格式化的文本文件joe abc
jane def
我的代码问题是
如果我第一次输入joe,程序将提示“用户名存在!”
如果我在此之后输入jane,程序将提示“用户名存在!”
但如果我在此之后输入joe,程序将只假设用户名joe不存在并提示我输入密码。
我的输出(尝试失败)
Enter Desired UserName: joe
User Name existed!
Enter Desired UserName: jane
User Name existed!
Enter Desired UserName: joe
Enter Desired Password:
期望的输出
Enter Desired UserName: joe
User Name existed!
Enter Desired UserName: jane
User Name existed!
Enter Desired UserName: joe
User Name existed!
Enter Desired UserName: jane
User Name existed!
Enter Desired UserName: joe
User Name existed!
Enter Desired UserName: joe
User Name existed!
Enter Desired UserName: jane
User Name existed!
Enter Desired UserName: bob
Enter Password: <---(password will only be prompted to key in if the username does not exist in the text file, otherwise it's will contiune to show "User Name existed" if username exist in text file)
这是我的代码
的main.cpp
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
string line, userName,userNameInFile,password;
ofstream fout;
ifstream readFile("userandPassword.txt");
cout << "Enter Desired UserName: ";
cin >> userName;
while (getline(readFile, line)) {
stringstream iss(line);
iss >> userNameInFile;
while (userNameInFile == userName) {
cout << "User Name existed!" << endl;
cout << "Enter Desired UserName: ";
cin >> userName;
}
}
cout << "Enter Desired Password: ";
cin >> password;
fout.open("userandPassword.txt",ios::app);
fout << userName << ' ' << password << endl;
// close file.
fout.close();
cout << "\nAccount Created and stored into TextFile!" << endl;
return 0;
}
我不确定是什么导致它像这样。请帮忙。感谢。
更新回答*
string line, userName,userNameInFile,password;
ofstream fout;
vector<string> storeUserName;
ifstream readFile("userandPassword.txt");
while (getline(readFile, line)) {
stringstream iss(line);
iss >> userNameInFile;
storeUserName.push_back(userNameInFile);
}
cout << "Enter Desired UserName: ";
do {
for (int i =0; i<storeUserName.size(); i++) {
if (storeUserName[i] == userName) {
cout << "Existing UserName Existed!\n";
cout << "Enter Desired UserName: ";
}
}
}while (cin >> userName);
答案 0 :(得分:3)
首先,您从文件中读取用户"joe"
,并检查它是否与用户输入中的用户名匹配。确实如此,然后您要求另一个用户名"jane"
。它没有匹配,因此内部循环中断并且外部循环继续。此循环从文件中读取下一个用户名,并且它与用户最后输入的用户名匹配,因此您要求用户输入新用户名。这个新的名称与文件中的当前名称不匹配,因此内部循环中断,外部循环继续,但它位于文件的末尾,因此它会中断,并且您创建一个具有现有用户名的用户。
如果您在调试器中逐步执行代码,则很容易发现此问题。
要解决此问题,您可能需要分两步完成。首先将文件读入集合,例如包含用户名和密码的std::vector
结构。然后,您要求用户输入用户名,并在集合中查找。
答案 1 :(得分:0)
将现有用户名读入数组,然后将输入用户名与数组元素进行匹配。
如果找到,请询问不同的用户名。
请求密码。