C语言实现可写入文件的账号密码登录系统

点击蓝字

31ee95385421e9eae98b2eeba873ab48.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

账号登录系统在很多系统设计时都时必不可少的,今天这个登录系统功能较全,可以注册,登录,找回密码,修改密码,以及在输入密码时会有*将密码掩盖,还有完善地登录选择界面,废话不多,上代码!

目录

  • 1.头文件&结构体&大概函数实现

  • 2.主函数&登录界面

  • 3.注册系统

  • 4.登录系统

  • 5.找回密码(更改密码)

  • 6.密码输入获取&密码掩盖

7.完整代码!!!!!

!!!!首先需要在和.c文件同个目录下新建一个文件储存数据,命名users.dat  如图!!

ddbd4b8325f54ec8a808586ca325d08c.png
img

!!!!!!!!!!!!!!!!!!!!

也可以命名别的,后缀dat是我自己随便取的,喜欢就行!但是记得在代码中将文件名改过来!

1.头文件&结构体&大概函数实现

//引头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>//用于反应意外情况的,下面会讲到
#include <windows.h>//定义宏常量
#define MAX_ID 11//ID的最大长度
#define MAX_PWD 20//密码的最大长度
#define MAX_NAME 15//名字的最大长度
#define MAX_SEX 5//性别的最大长度
#define MAX_PHONE 12//电话的最大长度//创建用户的结构体
typedef struct Users
{char id[MAX_ID];//id 即登录的账号char pwd[MAX_PWD];//密码char name[MAX_NAME];//姓名char sex[MAX_SEX];//性别char phone[MAX_PHONE];//电话
}Users;//声明函数//打印菜单
void menu();//用户注册
void Register();//登录
void Login();//找回密码
void Reback();//定位光标
void gotoxy();//获取x的位置
int posx();//获取y的位置
int posy();//密码输入(含掩盖功能)
void Getpwd(char* pwd);

这里定义了很多宏常量,可以看情况修改合适的数值,比较快捷方便,不用到代码里一个个改

2.主函数&登录界面

void menu()
{printf("************************************\n");printf("************************************\n");printf("*****1.Register         2.Login*****\n");printf("*****3.Reback           0.exit *****\n");printf("************************************\n");printf("************************************\n");
}int main()
{char input;do{menu();setbuf(stdin, NULL);//清空输入缓冲区,避免下面getchar读到上一次输入缓冲区剩下的东西input = getchar();switch (input){case '1':Register();break;case '2':Login();break;case '3':Reback();break;case '0':printf("退出成功!\n");break;default:printf("选择错误,请重新选择!\n");break;}} while (input!='0');//如果输入了0,就exit退出咯
}

这里用到字符去当作switch的判断依据,是因为如果用整形去做判断依据的话,若向input中输入的东西不是整形而是字符或者字符串,switch在循环中就会陷入死循环,具体情况大家去试试就知道,这里不多讲解,用单个字符判断到现在是没试出什么bug。

3.注册系统

void Register()
{Users a, b;//创建用户结构体临时变量,a是用来接收用户输入的,b是用来从文件中读取的,来和a作比较char tmp[20]="";//用着下面判断的printf("欢迎来到注册界面!\n");FILE* pf = fopen("users.dat", "rb");//"rb"是以二进制只读方式打开文件的意思fread(&b, sizeof(Users), 1, pf);//将数据读入b中if (!pf)//如果打开失败{printf("%s", strerror(errno));//errno可以理解是报的错误对应的编号,strerror可以把这个编号翻译出来,输出在屏幕上return;}Sleep(800);printf("请输入您的账号>>");scanf("%s", a.id);while (1){if (strcmp(a.id, b.id))//两个用户名不相等{if (!feof(pf))//没读到文件末尾{fread(&b, sizeof(Users), 1, pf);//继续读取文件中的用户到b中}else//读到文件末尾了,确认没有重复的id{break;}}else//有两个用户名相等{printf("此用户名已存在在,请重新输入!\n");Sleep(1000);fclose(pf);//关闭文件pf = NULL;//pf置空,避免野指针return;}}printf("请输入您的姓名>>");scanf("%s", a.name);printf("请输入您的性别>>");scanf("%s", a.sex);printf("请输入您的电话号码>>");scanf("%s", a.phone);printf("请输入您的密码>>");Getpwd(a.pwd);//输入密码的函数,有掩盖功能,下面会介绍printf("\n请再次确认您的密码>>");Getpwd(tmp);do{if (!strcmp(a.pwd, tmp))//两次密码相等{pf = fopen("users.dat", "ab");fwrite(&a, sizeof(Users), 1, pf);printf("\n账号注册成功,请登录!\n");Sleep(500);fclose(pf);pf = NULL;return;}else{printf("\n两次密码不匹配!请重新输入>>");Getpwd(a.pwd);printf("\n请再次确认>>");Getpwd(tmp);}} while (1);}

文件都是以二进制打开以二进制写入的,没别的原因,就是觉得帅!

关注公众号:C语言中文社区,免费领取300G编程资料

4.登录系统

void Login()
{Users a, b;//同理,a是用来给用户输入的,b是用来是水的(从文件中读取到b中,用b和a匹配比较)FILE* pf = fopen("users.dat", "rb");//以只读的方式打开文件if (!pf)//如果读取失败{printf("%s\n", strerror(errno));//上面有讲过~return;}printf("欢迎来到登录界面!\n");Sleep(1000);fread(&b, sizeof(Users), 1, pf);//先从文件中读取一个用户试试水printf("请输入账号>>");scanf("%s", a.id);while (1){if (!strcmp(a.id, b.id))//在文件中找到了与用户输入相同的id{break;}else{if (!feof(pf))//没读到文件末尾,继续读取文件中的id到b中{fread(&b, sizeof(Users), 1, pf);//继续从文件中读取用户信息进b,直到在文件中找到一个和a的信息相同的}else//读到文件末尾了,没有找到与用户输入相同的账号{printf("此账号不存在!请重新输入!\n");Sleep(500);fclose(pf);pf = NULL;return;}}}do{printf("请输入密码>>");Getpwd(a.pwd);//获取密码,在下面会讲if (!strcmp(a.pwd, b.pwd))//输入的密码与文件中的相同{printf("\n登录成功!欢迎使用!\n");Sleep(500);fclose(pf);//用完当然要把文件关啦pf = NULL;//置空,避免野指针return;}else{printf("\n密码输入错误,请重新输入\n");}} while (strcmp(a.pwd, b.pwd));}

大概思路就是用户先输入账号(id),接着b从文件中读取用户,直到找到与用户输入id相同的,然后就是输入密码判断密码对不对咯。  里面用到了一个库函数strcmp,判断字符串是不是一样的,如果一样则返回0,不一样则返回一个非0值。

5.找回密码(更改密码)

void Reback()
{char tmp[20] = "";//密码匹配用的Users a, b;FILE* pf = fopen("users.dat", "rb+");//"rb+"是为了读和写以二进制打开文件的意思if (!pf)//老样子,先判断能不能顺利打开{printf("%s", strerror(errno));return;}fread(&b, sizeof(Users), 1, pf);//照样,读一个试试水printf("请输入您的账号>>");Sleep(800);scanf("%s", a.id);while (1)//在文件中找到与用户输入相同的id{if (!strcmp(a.id, b.id))//如果读取到了相同的id(在文件中找到了和用户输入一样的){break;}else{if (!feof(pf))//没读到文件尾,继续读{fread(&b, sizeof(Users), 1, pf);}else{printf("您输入的账号不存在!请重新输入!\n");Sleep(500);fclose(pf);pf = NULL;break;}}}//下面是信息匹配验证do//匹配姓名{printf("请输入您的姓名>>");scanf("%s", a.name);if (!strcmp(a.name, b.name)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.name, b.name));do//匹配性别{printf("请输入您的性别>>");scanf("%s", a.sex);if (!strcmp(a.sex, b.sex)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.sex, b.sex));do//匹配电话号码{printf("请输入您的电话号码>>");scanf("%s", a.phone);if (!strcmp(a.phone, b.phone)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.phone, b.phone));//更改密码printf("验证成功!请修改您的密码!\n");printf("请输入您的密码>>");Getpwd(a.id);printf("请再次确认您的密码>>");Getpwd(tmp);if (!pf){printf("%s", strerror(errno));return;}//将原来的密码覆盖掉do{if (!strcmp(a.pwd, tmp))//两次密码相等{fseek(pf,-((int)(sizeof(Users)-MAX_ID)), SEEK_CUR);//将文件流调回到要修改的密码的位置fprintf(pf, "%s", a.pwd);//覆盖原来的密码printf("密码修改成功,请登录!\n");Sleep(500);fclose(pf);pf = NULL;return;}else{printf("两次密码不匹配!请重新输入>>");scanf("%s", a.pwd);printf("请再次确认>>");scanf("%s", tmp);}} while (1);}

大概思路是输入账号->匹配信息->修改密码,修改密码时要将文件流调回要修改的密码的前面,这里用到了fseek,-((int)(sizeof(Users)-MAX_ID))是要调回的范围。

6.密码输入获取&密码掩盖

void gotoxy(int x, int y)
{//更新光标位置COORD pos;HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//GetStdHandle是一个Windows API函数。pos.X = x;pos.Y = y;SetConsoleCursorPosition(hOutput, pos);
}int posx()
{CONSOLE_SCREEN_BUFFER_INFO ptr;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ptr);return (ptr.dwCursorPosition.X);
}int posy()
{CONSOLE_SCREEN_BUFFER_INFO ptr;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ptr);return (ptr.dwCursorPosition.Y);
}void Getpwd(char* pwd)
{int i = 0;int x, y;while (1){pwd[i] = getch();//获取单个密码(字符)if (pwd[i] == VK_BACK && i >= 0)//如果输入的是回退键,VK_BACK是键盘的键值,ASCII码值为8{if (i > 0)//i>0说明有输入东西了,则回退前一格{i--;x = posx() - 1;//定位x并回退一格y = posy();//定位ygotoxy(x, y);//定位光标printf(" ");//将*用空格掩盖x = posx() - 1;//再次回退,下次输入时光标才会显示在正确的位置y = posy();//定位ygotoxy(x, y);continue;//然后跳过此次循环}else if (i == 0)//i==0说明没输入东西,直接跳过此次循环即可{continue;}}if (i >= 0 && pwd[i] != VK_RETURN && pwd[i] != VK_BACK)//输入东西了{x = posx();y = posy();gotoxy(x, y);printf("*");}if (i == 0 && pwd[i] == VK_RETURN)//如果没输入东西直接按回车,直接跳过此次循环,避免程序把回车当密码了{continue;}if (pwd[i] == VK_RETURN||i==MAX_PWD-2)//输入回车了或者到上限了{i++;pwd[i] = '\0';//结尾放'\0'break;}i++;}
}

那几个长长的都是windows控制台的API函数,这里不多讲解

7.完整代码!!!!!

//引头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <windows.h>//定义宏常量
#define MAX_ID 11
#define MAX_PWD 20
#define MAX_NAME 15
#define MAX_SEX 5
#define MAX_PHONE 12//创建用户的结构体
typedef struct Users
{char id[MAX_ID];char pwd[MAX_PWD];char name[MAX_NAME];char sex[MAX_SEX];char phone[MAX_PHONE];
}Users;//声明函数//打印菜单
void menu();//用户注册
void Register();//登录
void Login();//找回密码
void Reback();//定位光标
void gotoxy();//获取x的位置
int posx();//获取y的位置
int posy();//密码输入(含掩盖功能)
void Getpwd(char* pwd);int main()//主函数 关注公众号:C语言中文社区,免费领取300G编程资料
{char input;do{menu();setbuf(stdin, NULL);input = getchar();switch (input){case '1':Register();break;case '2':Login();break;case '3':Reback();break;case '0':printf("退出成功!\n");break;default:printf("选择错误,请重新选择!\n");break;}} while (input!='0');
}//打印菜单
void menu()
{printf("************************************\n");printf("************************************\n");printf("*****1.Register         2.Login*****\n");printf("*****3.Reback           0.exit *****\n");printf("************************************\n");printf("************************************\n");
}//注册系统
void Register()
{Users a, b;//创建用户结构体临时变量,a是用来接收用户输入的,b是用来从文件中读取的,来和a作比较char tmp[20]="";//用着下面判断的printf("欢迎来到注册界面!\n");FILE* pf = fopen("users.dat", "rb");//"rb"是以二进制只读方式打开文件的意思fread(&b, sizeof(Users), 1, pf);//将数据读入b中if (!pf)//如果打开失败{printf("%s", strerror(errno));//errno可以理解是报的错误对应的编号,strerror可以把这个编号翻译出来,输出在屏幕上return;}Sleep(800);printf("请输入您的账号>>");scanf("%s", a.id);while (1){if (strcmp(a.id, b.id))//两个用户名不相等{if (!feof(pf))//没读到文件末尾{fread(&b, sizeof(Users), 1, pf);//继续读取文件中的用户到b中}else//读到文件末尾了,确认没有重复的id{break;}}else//有两个用户名相等{printf("此用户名已存在在,请重新输入!\n");Sleep(1000);fclose(pf);//关闭文件pf = NULL;//pf置空,避免野指针return;}}printf("请输入您的姓名>>");scanf("%s", a.name);printf("请输入您的性别>>");scanf("%s", a.sex);printf("请输入您的电话号码>>");scanf("%s", a.phone);printf("请输入您的密码>>");Getpwd(a.pwd);//输入密码的函数,有掩盖功能,下面会介绍printf("\n请再次确认您的密码>>");Getpwd(tmp);do{if (!strcmp(a.pwd, tmp))//两次密码相等{pf = fopen("users.dat", "ab");fwrite(&a, sizeof(Users), 1, pf);printf("\n账号注册成功,请登录!\n");Sleep(500);fclose(pf);pf = NULL;return;}else{printf("\n两次密码不匹配!请重新输入>>");Getpwd(a.pwd);printf("\n请再次确认>>");Getpwd(tmp);}} while (1);}//登录系统
void Login()
{Users a, b;//同理,a是用来给用户输入的,b是用来是水的(从文件中读取到b中,用b和a匹配比较)FILE* pf = fopen("users.dat", "rb");//以只读的方式打开文件if (!pf)//如果读取失败{printf("%s\n", strerror(errno));//上面有讲过~return;}printf("欢迎来到登录界面!\n");Sleep(1000);fread(&b, sizeof(Users), 1, pf);//先从文件中读取一个用户试试水printf("请输入账号>>");scanf("%s", a.id);while (1){if (!strcmp(a.id, b.id))//在文件中找到了与用户输入相同的id{break;}else{if (!feof(pf))//没读到文件末尾,继续读取文件中的id到b中{fread(&b, sizeof(Users), 1, pf);//继续从文件中读取用户信息进b,直到在文件中找到一个和a的信息相同的}else//读到文件末尾了,没有找到与用户输入相同的账号{printf("此账号不存在!请重新输入!\n");Sleep(500);fclose(pf);pf = NULL;return;}}}do{printf("请输入密码>>");Getpwd(a.pwd);//获取密码,在下面会讲if (!strcmp(a.pwd, b.pwd))//输入的密码与文件中的相同{printf("\n登录成功!欢迎使用!\n");Sleep(500);fclose(pf);//用完当然要把文件关啦pf = NULL;//置空,避免野指针return;}else{printf("\n密码输入错误,请重新输入\n");}} while (strcmp(a.pwd, b.pwd));}//找回密码
void Reback()
{char tmp[20] = "";//密码匹配用的Users a, b;FILE* pf = fopen("users.dat", "rb+");//"rb+"是为了读和写以二进制打开文件的意思if (!pf)//老样子,先判断能不能顺利打开{printf("%s", strerror(errno));return;}fread(&b, sizeof(Users), 1, pf);//照样,读一个试试水printf("请输入您的账号>>");Sleep(800);scanf("%s", a.id);while (1)//在文件中找到与用户输入相同的id{if (!strcmp(a.id, b.id))//如果读取到了相同的id(在文件中找到了和用户输入一样的){break;}else{if (!feof(pf))//没读到文件尾,继续读{fread(&b, sizeof(Users), 1, pf);}else{printf("您输入的账号不存在!请重新输入!\n");Sleep(500);fclose(pf);pf = NULL;break;}}}//下面是信息匹配验证do//匹配姓名{printf("请输入您的姓名>>");scanf("%s", a.name);if (!strcmp(a.name, b.name)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.name, b.name));do//匹配性别{printf("请输入您的性别>>");scanf("%s", a.sex);if (!strcmp(a.sex, b.sex)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.sex, b.sex));do//匹配电话号码{printf("请输入您的电话号码>>");scanf("%s", a.phone);if (!strcmp(a.phone, b.phone)){break;}else{printf("输入错误,请重新输入!\n");}} while (strcmp(a.phone, b.phone));//更改密码printf("验证成功!请修改您的密码!\n");printf("请输入您的密码>>");Getpwd(a.id);printf("请再次确认您的密码>>");Getpwd(tmp);if (!pf){printf("%s", strerror(errno));return;}//将原来的密码覆盖掉do{if (!strcmp(a.pwd, tmp))//两次密码相等{fseek(pf,-((int)(sizeof(Users)-MAX_ID)), SEEK_CUR);//将文件流调回到要修改的密码的位置fprintf(pf, "%s", a.pwd);//覆盖原来的密码printf("密码修改成功,请登录!\n");Sleep(500);fclose(pf);pf = NULL;return;}else{printf("两次密码不匹配!请重新输入>>");scanf("%s", a.pwd);printf("请再次确认>>");scanf("%s", tmp);}} while (1);}//定位光标
void gotoxy(int x, int y)
{//更新光标位置COORD pos;HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//GetStdHandle是一个Windows API函数。pos.X = x;pos.Y = y;SetConsoleCursorPosition(hOutput, pos);
}
//获取光标x坐标
int posx()
{CONSOLE_SCREEN_BUFFER_INFO ptr;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ptr);return (ptr.dwCursorPosition.X);
}
//获取光标y坐标
int posy()
{CONSOLE_SCREEN_BUFFER_INFO ptr;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ptr);return (ptr.dwCursorPosition.Y);
}//输入密码
void Getpwd(char* pwd)
{int i = 0;int x, y;while (1){pwd[i] = getch();//获取单个密码(字符)if (pwd[i] == VK_BACK && i >= 0)//如果输入的是回退键,VK_BACK是键盘的键值,ASCII码值为8{if (i > 0)//i>0说明有输入东西了,则回退前一格{i--;x = posx() - 1;//定位x并回退一格y = posy();//定位ygotoxy(x, y);//定位光标printf(" ");//将*用空格掩盖x = posx() - 1;//再次回退,下次输入时光标才会显示在正确的位置y = posy();//定位ygotoxy(x, y);continue;//然后跳过此次循环}else if (i == 0)//i==0说明没输入东西,直接跳过此次循环即可{continue;}}if (i >= 0 && pwd[i] != VK_RETURN && pwd[i] != VK_BACK)//输入东西了{x = posx();y = posy();gotoxy(x, y);printf("*");}if (i == 0 && pwd[i] == VK_RETURN)//如果没输入东西直接按回车,直接跳过此次循环,避免程序把回车当密码了{continue;}if (pwd[i] == VK_RETURN||i==MAX_PWD-2)//输入回车了或者到上限了{i++;pwd[i] = '\0';//结尾放'\0'break;}i++;}
}
如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...

概述&#xff1a;本道作业题是禄凡闷同学的课后练习&#xff0c;分享的知识点是复函数的图形&#xff0c;指导老师为终老师&#xff0c;涉及到的知识点涵盖&#xff1a;...1等等.只需大致图象&#xff0c;和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学&#x…

rxjava 循环发送事件_使用RxJava和SseEmitter进行服务器发送的事件

rxjava 循环发送事件Spring Framework 4.2 GA即将发布&#xff0c;让我们看一下它提供的一些新功能。 引起我注意的一个事件是一个简单的新类SseEmitter &#xff0c;它是对Spring MVC控制器中容易使用的发送事件的抽象。 SSE是一项技术&#xff0c;可让您在一个HTTP连接内沿一…

一文搞懂 | Linux 内核的 4 大 IO 调度算法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删Linux 内核包含4个IO调度器&#xff1a;Noop IO schedulerAnticipatory IO schedulerDeadline IO scheduler CFQ IO scheduler。anticipatory, 预…

众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”

众神进入瓦尔哈拉通过所有有关Java 9和Project Jigsaw的讨论&#xff0c;我们不应忽视Java的另一重大变化。 希望在第10版或第11版中&#xff0c; Valhalla项目能够实现并介绍价值类型和专业化。 那么&#xff0c;这是什么一回事&#xff0c;项目进展如何&#xff0c;面临什么…

当电子工程师十余年,感慨万千!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删当电子工程师也一些年头了&#xff0c;不算有出息&#xff0c;环顾四周&#xff0c;也没有看见几个有出息的。回顾工程师生涯&#xff0c;感慨万…

canva画图 图片居中裁剪_css实现不定宽高的图片img居中裁剪_类似微信朋友圈图片效果...

需求如下&#xff1a;前端需要显示矩形的缩略图&#xff0c;接口返回的图片尺寸大小不一&#xff0c;宽高不相等&#xff0c;需要前端来处理并显示成正方形&#xff0c;类似微信朋友圈图片的效果&#xff0c;等比例正方形显示在列表中&#xff0c;让图片根据宽高来自适应显示在…

哈希策略_优化哈希策略的简介

哈希策略总览 用于哈希键的策略可以直接影响哈希集合&#xff08;例如HashMap或HashSet&#xff09;的性能。 内置的哈希函数被设计为通用的&#xff0c;并且可以在各种用例中很好地工作。 我们可以做得更好&#xff0c;特别是如果您对用例有一个很好的了解吗&#xff1f; 测…

面试大全 | C语言高级部分总结,2.6万字长文

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个 Bank&#xff08;就是…

c#设计12星座速配软件_C#设计模式(12)——组合模式

阅读目录1.组合模式在软件开发中我们经常会遇到处理部分与整体的情况&#xff0c;如我们经常见到的树形菜单&#xff0c;一个菜单项的子节点可以指向具体的内容&#xff0c;也可以是子菜单。类似的情况还有文件夹&#xff0c;文件夹的下级可以是文件夹也可以是文件。举一个例子…

hibernate与jpa_将JPA Hibernate与OptaPlanner集成

hibernate与jpa我们一直在改进OptaPlanner与JEE其余部分的集成&#xff0c;因此更容易构建可以正常工作的最终用户应用程序。 让我们看一下改进的JPA Hibernate集成。 基础 JPA Hibernate和OptaPlanner都可以在POJO&#xff08;普通的旧Java对象&#xff09;上工作&#xff0c…

程序如何运行,编译、链接、装入?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、地址概念和程序如何运行在多道程序环境下&#xff0c;要使程序运行&#xff0c;必须先为之创建进程。而创建进程的第一件事&#xff0c;便是…

python举两种字符串引号的例子_python里的单引号和双引号的有什么作用

在Python当中表达字符串既可以使用单引号&#xff0c;也可以使用双引号&#xff0c;那两者有什么区别吗&#xff1f;python单引号和双引号的区别简单来说&#xff0c;在Python中使用单引号或双引号是没有区别的&#xff0c;都可以用来表示一个字符串。但是这两种通用的表达方式…

枚举对象注释_如何以及何时使用枚举和注释

枚举对象注释本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &#xff01;…

background 互联网图片_cssbackground-image和layer-background-image的区别

layer-background-image语法&#xff1a;layer-background-image : none | url (url)参数&#xff1a;none :  无背景图url :  使用绝对或相对地址指定背景图像说明&#xff1a;设置或检索对象整个区域的背景图像。示例&#xff1a;code {position: absolute;top: 100px; lef…

纪事本 乱码_纪事日记–可自定义的数据存储

纪事本 乱码总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作&#xff0c;而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是&#xff0c;它做得特别不好。 自定义数据存储在性能方面可以实现什么&#xff1f; 您可以支持&#…

datavideo切换台说明书_【新品发布】datavideo SE-650 高清四通道切换台

还在为音乐演唱会的拍摄而烦恼吗&#xff1f;或者为体育比赛的多机位发愁&#xff1f;或者为微课、优课、慕课制作而焦头烂额&#xff1f;大部分用户对多机位的恐惧来源于相关产品令人发指的复杂和专业性&#xff0c;面对满眼的键盘会有无从下手之感&#xff0c;很多学校和工作…

NSA:建议从 C/C++ 切换到内存安全语言

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删美国国家安全局&#xff08;NSA&#xff09;发布了一份指南&#xff0c;旨在帮助软件开发商和运营商预防和缓解软件内存安全问题。其鼓励组织将编…

探索cqrs和事件源_编写基于事件的CQRS读取模型

探索cqrs和事件源关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是&#xff0c;尽管也有一些有趣的考虑&#xff0c;但读取模型经常被忽略。 在本文中&#xff0c;我们将介绍通过使用事件流来填充视图模型的示例实现。 总览 …

shmmax单位_kernel.shmmax ,kernel.shmmni 和kernel.shmall

kernel.shmmax 2147483648//该参数定义了共享内存段的最大尺寸(以字节为单位)。其值应>sag_max_size初始化参数的大小,否则SAG由多个内存段构成,效率降低,还要不小于物理内存的一半,默认情况下在32位x86系统中,OracleSGA最大不能超过1.7GB.缺省为32M&#xff0c;对于oracle…

C# 11正式发布

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C# 11 现已发布。公告称&#xff0c;“随着每个版本的发布&#xff0c;社区的参与度越来越高&#xff0c;贡献了从建议、见解和错误报告到整个功…