c文件输入功能无法正常工作

时间:2015-01-12 05:54:00

标签: c file input char fgets

我有这个功能,应该检查一个用户名是否被列入黑名单,如果它不是,它应该"登录"用户通过检查该用户名是否存在于第二个文件中。如果是,那么该文件中的那一行将被记住,如果记住的行上的密码是正确的,该函数应该检查第三个文件,所以基本上用户名的行是他的密码行,如果那两个匹配根据输入而用户未被列入黑名单,则应返回正面答案。

不幸的是,无论我输入什么,我的功能似乎都会得到肯定的回答。任何人都可以指出我的错误是什么,以便它能按预期工作吗?

编辑出无意识的错误,如果文件不在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]='\0';
                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]='\0';
                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]='\0';
                    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");
}

示例文件(&#34; loginuser.txt&#34; /&#34; loginpw.txt&#34;):

hihi
aloss
foif
distsd

blacklist.txt:

carl
gigc
ffgfd
gdfgdd
rreti

1 个答案:

答案 0 :(得分:3)

我可以看到代码的问题很少。

  • 如果blacklist.txt中没有用户名,那么它永远不会出现在while循环中。而是直到文件末尾。
  • 而不是&#34; ==&#34;,你给了&#34; =&#34;比较,它将进行分配而不是比较。
  • 在打开文件后立即检查文件指针的有效性,这样您就不需要每次循环验证它。这是一个性能损失。
  • 编写文件读取功能。这将使调试更容易。
  • 如果您无法使用调试器,请添加一些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]='\0';
        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;
}