C++通过文件读写保存用户注册登录信息

        我的MySQL因为电脑的反复重装实在是装不好了,不知道少卸载了什么导致MySQL装不好。那么我就自己写一个文件来保存用户名和密码这两个登录信息吧。整体上用到了文件的读写操作。

        我用到了两个函数,分别是int regest()和int login(),分别处理用户的注册和登录消息。注册用户只需要查找之前有没有用户名,如果有,那么返回0,通知有重复的用户名,换一个用户名;如果没有那么可以注册,返回1。登录的情况稍微复杂一点,需要首先看用户名是否存在,如果用户名不存在返回2,如果用户名在那么看数据库密码和用户提供的密码是不是匹配。如果匹配说明登录成功,返回1,如果不匹配接着寻找,寻找完数据库中的所有数据,还是不匹配则返回3,表示密码错误。

        代码部分如下:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <iomanip>

using std::cin;
using std::cout;
using std::endl;
using std::ifstream;
using std::ofstream;
using std::ios;
using std::cerr;
using std::string;
using std::setw;


struct UsrInfo//用户名的账户和密码信息
{
	char UsrName[20];
	char Psword[20];
};
/*
注意我的文件中用户名是一行,密码是一样。在注册的时候只需要看用户名,不需要看密码是不是相符,所以设置i为计数变量,当i不能整除2
的时候是访问用户名的时候,当i整除2的时候是访问密码的时候。读入密码这一行直接跳出去就行了。
*/
int regest(struct UsrInfo* usr){//注册程序
	char usrname[20];
	char psword[20];
	strcpy_s(usrname, usr->UsrName);
	strcpy_s(psword, usr->Psword);
	string temp;
	int flag = 0;
	int i = 0;
	ifstream fin("E:\\VS2013_code\\fileReadWrite\\UsrInfo.txt", ios::in);//在这个路径下读入文件
	ofstream fout("E:\\VS2013_code\\fileReadWrite\\UsrInfo.txt", ios::app);//在同一个路径下,如果注册成功则写入文件
	while (std::getline(fin, temp))//每次读一行的数据进入temp中。
	{
		i++;
		if (i % 2 == 0) continue;//访问的是密码这一行,跳出。
		if (!strcmp(usrname, temp.c_str())) flag = 1;//flag=1说明用户名已经被注册了
	}
	fin.close();
	if (flag){
		return 0;//之前有重复的账户名
	}
	else{//没注册
		fout << usrname << endl;//向文件写入注册者的用户名,然后换一行
		fout << psword << endl;//写入密码,换行
		fout.close();
		return 1;//注册成功
	}
}
int login(struct UsrInfo* usr){
	char usrname[20];
	char psword[20];
	strcpy_s(usrname, usr->UsrName);
	strcpy_s(psword, usr->Psword);
	string temp1;
	string temp2;
	int existname = 0;
	int match = 0;
	int i = 0;
	ifstream fin("E:\\VS2013_code\\fileReadWrite\\UsrInfo.txt", ios::in);
	while (std::getline(fin, temp1))
	{
		std::getline(fin, temp2);//一次读进去两行,分别是用户名和密码
		if (!strcmp(usrname, temp1.c_str())){//有这个用户名了,接下来看看密码是不是相符的
			existname = 1;
			if (!strcmp(psword, temp2.c_str())){//相符
				match = 1;
				break;
			}
		}
	}
	fin.close();
	if (!existname){
		return 2;//没有账户名
	}
	else{
		if (match) return 1;
		else return 3;//用户名和密码不匹配
	}
}
int main()
{
	UsrInfo test1;//用于测试注册程序的。
	strcpy_s(test1.UsrName, "admin1");
	strcpy_s(test1.Psword, "wzn");
	switch (regest(&test1))
	{
	case 1:
		cout << "注册成功" << endl;
		break;
	case 0:
		cout << "用户名已被注册,请重新选择用户名" << endl;
		break;
	default:
		break;
	}

	UsrInfo test2;//用于测试注册程序的。
	strcpy_s(test2.UsrName, "admin1");
	strcpy_s(test2.Psword, "wzn");
	switch (login(&test2))
	{
	case 1:
		cout << "登录成功" << endl;
		break;
	case 3:
		cout << "密码错误" << endl;
		break;
	case 2:
		cout << "没有此用户名,请注册" << endl;
		break;
	default:
		break;
	}
	return 0;
}
所以谁有办法叫我MySQL除了重装系统以外怎么重新安装啊,,,,
  • 20
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的用户注册登录系统的C代码,其中使用了文件操作来存储用户信息。请注意,这只是一个示例代码,实际的实现可能需要更多的安全措施和错误处理。 ```c #include <stdio.h> #include <string.h> #define MAX_USERS 100 // 最大用户数 #define MAX_USERNAME_LENGTH 20 // 用户名最大长度 #define MAX_PASSWORD_LENGTH 20 // 密码最大长度 #define USERS_FILE "users.dat" // 用户信息文件名 // 用户结构体,包含用户名和密码 typedef struct { char username[MAX_USERNAME_LENGTH]; char password[MAX_PASSWORD_LENGTH]; } User; // 用户数组 User users[MAX_USERS]; int num_users = 0; // 读取用户信息文件 void load_users() { FILE *fp = fopen(USERS_FILE, "rb"); if (fp) { fread(&num_users, sizeof(int), 1, fp); fread(users, sizeof(User), num_users, fp); fclose(fp); } } // 保存用户信息文件 void save_users() { FILE *fp = fopen(USERS_FILE, "wb"); if (fp) { fwrite(&num_users, sizeof(int), 1, fp); fwrite(users, sizeof(User), num_users, fp); fclose(fp); } } // 用户注册 void register_user() { // 获取用户名和密码 char username[MAX_USERNAME_LENGTH]; char password[MAX_PASSWORD_LENGTH]; printf("Username: "); scanf("%s", username); printf("Password: "); scanf("%s", password); // 检查用户名是否已存在 for (int i = 0; i < num_users; i++) { if (strcmp(users[i].username, username) == 0) { printf("Username already exists.\n"); return; } } // 创建新用户 if (num_users < MAX_USERS) { User user; strcpy(user.username, username); strcpy(user.password, password); users[num_users++] = user; printf("User registered.\n"); save_users(); } else { printf("Max number of users reached.\n"); } } // 用户登录 void login() { // 获取用户名和密码 char username[MAX_USERNAME_LENGTH]; char password[MAX_PASSWORD_LENGTH]; printf("Username: "); scanf("%s", username); printf("Password: "); scanf("%s", password); // 查找用户 for (int i = 0; i < num_users; i++) { if (strcmp(users[i].username, username) == 0 && strcmp(users[i].password, password) == 0) { printf("Login successful.\n"); return; } } printf("Invalid username or password.\n"); } int main() { // 读取用户信息文件 load_users(); // 用户注册或登录 int choice; printf("1. Register\n2. Login\n"); scanf("%d", &choice); if (choice == 1) { register_user(); } else if (choice == 2) { login(); } else { printf("Invalid choice.\n"); } return 0; } ``` 用户信息被存储在一个二进制文件中,文件格式如下: ``` [4字节] 用户数 [用户结构体] 用户1 [用户结构体] 用户2 ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值