我试图基于txt
制作简单的登录系统。
file
看起来像
1 1
2 2
3 3
但我的代码只检查txt
的最后一行,而不是每一行。
int write_login_and_pass() {
char login[30], pass[30];
int select3;
printf("\n|---------Login:");
scanf("%s", login);
printf("|---------Password:");
scanf("%s", pass);
sign_In(login, pass);
_getch();
system("PAUSE");
return 0;
}
int sign_In(char login[30], char pass[30]) {
FILE *file;
char user2[30], pass2[30], fc;
file = fopen("Customers.txt", "r");
char arra[128][128];
if (file != NULL) {
char line[128];
do {
fscanf(file, "%29s %29s", user2, pass2);
}while (fgets(line, sizeof line, file) != NULL);
if ((strcmp(login, user2) == 0) && (strcmp(pass, pass2) == 0)) {
printf("\n>>>User and password correct!<<<\n");
fc = main_menu();
}
else {
printf("\n>>>User or password incorrect!<<<\n");
system("PAUSE");
fc = sign_In(login, pass);
}
}
else printf("File was not founded");
fclose(file);
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
问题出在这里:
char user2[30], pass2[30], fc;
file = fopen("Customers.txt", "r");
if (file)
{
while(fscanf(file, "%29s %29s", user2, pass2) == 2)
{
// do comparisons here
}
fclose(file);
}
首先,你读了一对用户密码1),然后你尝试来读取第2行的结尾 - 但是在成功时,就像在while循环中一样,你重新进入在评估到目前为止读取的密码之前......
现在有两个选项,首先是简单的选项:
u1 p1
u2
p2 u3
p3 u4 p4
请注意,绝对依赖于正确的文件格式,i。即总是关注一个用户后跟他/她的相关密码 - 顺便说一下,空格无关紧要,所以文件甚至可能是这样的:
char user2[30], pass2[30], line[128];
file = fopen("Customers.txt", "r");
if (file)
{
while(fgets(line, sizeof line, file)
{
if(sscanf(line, "%29s %29s", user2, pass2) == 2)
// ^ (!)
{
// do comparisons here
}
// else: line is invalid!
}
fclose(file);
}
但是,其中一对失踪,你的登录完全坏了!
第二个选项:逐行阅读:
char *user2, *pass2, line[128];
file = fopen("Customers.txt", "r");
if (file)
{
while(fgets(line, sizeof line, file)
{
if((user2 = strtok(line, " \t") && (pass2 = strtok(NULL, " \t"))
{
// do comparisons here
}
// else: line is invalid!
}
fclose(file);
}
我个人更喜欢strtok
而不是sscanf,因为你不必这样复制字符串:
{{1}}
(唯一的缺点:strtok不是thread safe)