c 文件输入函数无法按预期工作
c file input function not working as intended
我有这个功能应该检查用户名是否被列入黑名单,如果没有,它应该 "log in" 用户通过检查该用户名是否存在于第二个文件中。如果是,那么文件中的那一行将被记住,如果记住的行上的密码正确,函数应该检查第三个文件,所以基本上用户名的行就是他的密码的行,如果这两个匹配有了输入并且用户没有被列入黑名单,那么它应该 return 一个肯定的答案。
不幸的是,无论我输入什么,我的功能似乎都是 return 肯定的答案。任何人都可以指出我的错误是什么,以便它能按预期工作吗?
编辑了无意的错误,我仍然遇到如果文件不在 blacklist.txt
中我无法停止阅读的问题
代码:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <netdb.h>
int login(char username[20],char pw[20])
{
FILE *fp = fopen("blacklist.txt","r");
int ok = 0, pw_line=0,oku=0,savepwline=0,count=0,okp=0;
while (ok==0)
{
if (fp != NULL)
{
char line[20];
while (fgets(line,sizeof(line), fp) != NULL)
{
size_t i=strlen(line)-1;
if(line[i]=='\n')
line[i]='[=10=]';
if (strcmp(username,line) == 0 ) ok=1;
}
}
}
fclose(fp);
if (ok==1)
{
printf("user blacklisted\n");
}
else
{
FILE *fp2 = fopen("loginuser.txt","r");
while (oku==0)
{
if (fp2 != NULL)
{
char line3[20];
while (fgets(line3,sizeof(line3), fp2) != NULL)
{
pw_line++;
size_t i=strlen(line3)-1;
if(line3[i]=='\n')
line[i]='[=10=]';
if (strcmp(username,line3) == 0 ) { oku=1; savepwline=pw_line; }
}
}
}
FILE *fp3 = fopen("loginpw.txt","r");
if (oku==1)
if (fp3 != NULL)
{
char line2[20];
while (fgets(line2,sizeof(line2), fp3) != NULL)
{
if ( count == savepwline )
{
size_t i=strlen(line2)-1;
if(line2[i]=='\n')
line2[i]='[=10=]';
if (strcmp(pw,line2) == 0 ) okp=1;
}
else count++;
}
}
fclose(fp2);
fclose(fp3);
}
if(oku&&okp) return 1;
else return 0;
}
int main()
{
char a[20],b[20];
scanf("%s",a);
scanf("%s",b);
if(login(a,b)) printf("yes");
else printf("no");
}
样本文件("loginuser.txt"/"loginpw.txt"):
hihi
aloss
foif
distsd
blacklist.txt:
carl
gigc
ffgfd
gdfgdd
rreti
我发现代码没有什么问题。
- 如果用户名不在 blacklist.txt 中,它永远不会退出 while 循环。改为读取文件末尾。
- 您使用“=”代替“==”进行比较,这将进行赋值而不是比较。
- 打开文件后立即检查文件指针的有效性,这样就不需要在循环中每次都验证它。这是一个性能问题。
- 写一个文件读取函数。这将使调试更容易。
- 如果您不会使用调试器,请添加一些 printf 语句,这将有助于您理解代码流程。
请参阅下面更正后的代码。我没有添加密码比较检查。你可以自己做。
// Returns 1 if found. Returns 0 on not found/error
int isEntryFound(char *fileName, char *inputStr)
{
FILE *fp = fopen(fileName,"r");
if (fp == NULL)
{
// Couldnt verify. Mark as error
return 0;
}
int ok = 0;
char line[20];
while (fgets(line,sizeof(line), fp) != NULL)
{
size_t i=strlen(line)-1;
if(line[i]=='\n')
line[i]='[=10=]';
if (strcmp(inputStr,line) == 0 ) ok=1;
}
fclose(fp);
if(ok == 1)
return 1;
return 0;
}
int login(char *username,char pw[20])
{
int blackListed = isEntryFound("blacklist.txt", username);
if(blackListed)
{
printf("Blacklisted\n");
return 0;
}
int userFound = isEntryFound("loginuser.txt", username);
if(!userFound)
{
printf("User not Found\n");
return 0;
}
// TODO: Read and compare the passwords the same way
return 0;
}
我有这个功能应该检查用户名是否被列入黑名单,如果没有,它应该 "log in" 用户通过检查该用户名是否存在于第二个文件中。如果是,那么文件中的那一行将被记住,如果记住的行上的密码正确,函数应该检查第三个文件,所以基本上用户名的行就是他的密码的行,如果这两个匹配有了输入并且用户没有被列入黑名单,那么它应该 return 一个肯定的答案。
不幸的是,无论我输入什么,我的功能似乎都是 return 肯定的答案。任何人都可以指出我的错误是什么,以便它能按预期工作吗?
编辑了无意的错误,我仍然遇到如果文件不在 blacklist.txt
中我无法停止阅读的问题代码:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <netdb.h>
int login(char username[20],char pw[20])
{
FILE *fp = fopen("blacklist.txt","r");
int ok = 0, pw_line=0,oku=0,savepwline=0,count=0,okp=0;
while (ok==0)
{
if (fp != NULL)
{
char line[20];
while (fgets(line,sizeof(line), fp) != NULL)
{
size_t i=strlen(line)-1;
if(line[i]=='\n')
line[i]='[=10=]';
if (strcmp(username,line) == 0 ) ok=1;
}
}
}
fclose(fp);
if (ok==1)
{
printf("user blacklisted\n");
}
else
{
FILE *fp2 = fopen("loginuser.txt","r");
while (oku==0)
{
if (fp2 != NULL)
{
char line3[20];
while (fgets(line3,sizeof(line3), fp2) != NULL)
{
pw_line++;
size_t i=strlen(line3)-1;
if(line3[i]=='\n')
line[i]='[=10=]';
if (strcmp(username,line3) == 0 ) { oku=1; savepwline=pw_line; }
}
}
}
FILE *fp3 = fopen("loginpw.txt","r");
if (oku==1)
if (fp3 != NULL)
{
char line2[20];
while (fgets(line2,sizeof(line2), fp3) != NULL)
{
if ( count == savepwline )
{
size_t i=strlen(line2)-1;
if(line2[i]=='\n')
line2[i]='[=10=]';
if (strcmp(pw,line2) == 0 ) okp=1;
}
else count++;
}
}
fclose(fp2);
fclose(fp3);
}
if(oku&&okp) return 1;
else return 0;
}
int main()
{
char a[20],b[20];
scanf("%s",a);
scanf("%s",b);
if(login(a,b)) printf("yes");
else printf("no");
}
样本文件("loginuser.txt"/"loginpw.txt"):
hihi
aloss
foif
distsd
blacklist.txt:
carl
gigc
ffgfd
gdfgdd
rreti
我发现代码没有什么问题。
- 如果用户名不在 blacklist.txt 中,它永远不会退出 while 循环。改为读取文件末尾。
- 您使用“=”代替“==”进行比较,这将进行赋值而不是比较。
- 打开文件后立即检查文件指针的有效性,这样就不需要在循环中每次都验证它。这是一个性能问题。
- 写一个文件读取函数。这将使调试更容易。
- 如果您不会使用调试器,请添加一些 printf 语句,这将有助于您理解代码流程。
请参阅下面更正后的代码。我没有添加密码比较检查。你可以自己做。
// Returns 1 if found. Returns 0 on not found/error
int isEntryFound(char *fileName, char *inputStr)
{
FILE *fp = fopen(fileName,"r");
if (fp == NULL)
{
// Couldnt verify. Mark as error
return 0;
}
int ok = 0;
char line[20];
while (fgets(line,sizeof(line), fp) != NULL)
{
size_t i=strlen(line)-1;
if(line[i]=='\n')
line[i]='[=10=]';
if (strcmp(inputStr,line) == 0 ) ok=1;
}
fclose(fp);
if(ok == 1)
return 1;
return 0;
}
int login(char *username,char pw[20])
{
int blackListed = isEntryFound("blacklist.txt", username);
if(blackListed)
{
printf("Blacklisted\n");
return 0;
}
int userFound = isEntryFound("loginuser.txt", username);
if(!userFound)
{
printf("User not Found\n");
return 0;
}
// TODO: Read and compare the passwords the same way
return 0;
}