帮我写一个C++代码,要求用文件的形式进行保存和输出,且可以在代码运行界面进行输入和查询,代码要求功能如下,设计一个宿舍电话查询系统要求:(1)用户输入用户名及口令,然后在已有的用户名及口令中检查是否合法,合法进入查询界面;对于不合法的用户或口令最多出错3次,超出3次后自动退出程序;(2)进入系统的用户可以浏览所有用户的电话号码及相关资料(如下图所示);(3)参考所给出的程序,自行设定数据库(要求至少包括:宿舍号、班级、电话号码三个字段,其它字段可选),系统菜单及其未说明功能可自行添加设计。据
时间: 2024-03-25 11:35:34 浏览: 50
好的,下面是一个使用文件形式保存和输出数据的宿舍电话查询系统,实现了上述功能要求:
```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// 数据库文件名
const string DATABASE_FILENAME = "database.txt";
// 用户名和密码文件名
const string USERS_FILENAME = "users.txt";
// 数据库
map<string, map<string, string>> database;
// 用户名和密码
map<string, string> users;
// 读取数据库文件
void readDatabase()
{
ifstream fin(DATABASE_FILENAME);
if (!fin) {
cout << "数据库文件不存在!" << endl;
return;
}
string line;
while (getline(fin, line)) { // 逐行读取
string username, dormitory, class_, phone;
istringstream iss(line);
iss >> username >> dormitory >> class_ >> phone;
database[username] = {
{"宿舍号", dormitory},
{"班级", class_},
{"电话号码", phone}
};
}
fin.close();
}
// 读取用户名和密码文件
void readUsers()
{
ifstream fin(USERS_FILENAME);
if (!fin) {
cout << "用户名和密码文件不存在!" << endl;
return;
}
string line;
while (getline(fin, line)) { // 逐行读取
string username, password;
istringstream iss(line);
iss >> username >> password;
users[username] = password;
}
fin.close();
}
// 保存数据库
void saveDatabase()
{
ofstream fout(DATABASE_FILENAME);
for (auto& item : database) { // 遍历数据库
fout << item.first << " "; // 用户名
for (auto& detail : item.second) { // 遍历用户信息
fout << detail.second << " "; // 信息内容
}
fout << endl;
}
fout.close();
}
// 登录函数
bool login()
{
int try_cnt = 0; // 尝试次数
string username, password;
while (try_cnt < 3) { // 最多尝试 3 次
cout << "请输入用户名:";
cin >> username;
cout << "请输入密码:";
cin >> password;
if (users.count(username) && users[username] == password) { // 用户名和密码匹配
return true;
} else {
cout << "用户名或密码错误!" << endl;
try_cnt++;
}
}
cout << "错误次数过多,程序退出!" << endl;
return false;
}
// 查询函数
void query()
{
cout << "用户名\t宿舍号\t班级\t电话号码" << endl;
for (auto& item : database) { // 遍历数据库
cout << item.first << "\t"; // 用户名
for (auto& detail : item.second) { // 遍历用户信息
cout << detail.second << "\t"; // 信息内容
}
cout << endl;
}
}
int main()
{
readDatabase(); // 读取数据库
readUsers(); // 读取用户名和密码
if (!login()) { // 登录失败
return 0;
}
query(); // 查询
saveDatabase(); // 保存数据库
return 0;
}
```
程序会先读取数据库文件和用户名和密码文件,如果文件不存在,则输出错误信息。然后让用户输入用户名和密码,如果用户名和密码匹配,则进入查询界面,显示所有用户的信息,包括宿舍号、班级和电话号码。如果用户名或密码错误,最多允许用户尝试 3 次,超过次数则自动退出程序。查询界面结束后,程序会将修改后的数据库保存到文件中。
注意,这个程序同样只是一个简单的示例,还有很多需要改进的地方,比如文件的打开和关闭需要进行错误处理,用户输入时需要进行输入检查,数据库可以用更为高效的数据结构来实现,系统菜单和其它功能也可以进一步添加。
阅读全文