1

我有一个检查用户名和密码的功能。我有两个文本文件,一个用于单行用户名,另一个用于单行密码。然后我从 txtfile 读取这些数据并将它们存储为 2 个字符串。然后我将这些与用户使用返回 1 表示成功的函数输入的用户名和密码进行比较。但是我的代码给出了错误的输出。

int compare(char C[], char E[])
{
    ifstream fil1;
    ifstream fil2;
    fil1.open("user.txt", ios::in);
    fil2.open("pass.txt", ios::in);
    char ch1, ch2;
    char B[50], F[50];
    int i1 = 0, i2 = 0;

    while (!fil1.eof())
    {
        fil1.get(ch1);
        F[i1] = ch1;
        i1++;
    }
    F[i1] = '\0';
    fil1.close();

    while (!fil2.eof())
    {
        fil2.get(ch2);
        B[i2] = ch2;
        i2++;
    }
    B[i2] = '\0';
    fil2.close();

    int flag;
    int X = strlen(E);
    int Y = strlen(B);
    if (X == Y)
    {
        if ((strcmp(C, F) == 0) && (strcmp(E, B) == 0))
            flag = 1;
        else
            flag = 0;
    }
    else
        flag = 0;
    return flag;
}

即使用户名和密码正确,它也会给出错误的输出。错误在哪里??

4

3 回答 3

0

假设您有“user.txt”,其中包含“user”文本。您将拥有 F = "userr" 和双尾符号 'r',因为 fil.eof() 仅在尝试读取文件末尾之后才返回 true。正确的循环是:

while(fil1.get(ch1)) {
  F[i1] = ch1;
  i1++;
}

第二个循环也一样。

于 2013-10-31T17:54:17.150 回答
0

简单来说,eof() 仅在我们尝试读取文件末尾(超过文件大小)时才返回 true。因此,您应该按如下方式更改代码:

while(true)
{
  fil1.get(ch1);
  if(fil1.eof())
    break;
  F[i1]=ch1;
  i1++;
}
于 2013-10-31T17:48:12.840 回答
0

如果您使用std::string,则:

 while (!fil1.eof())
 {
     fil1.get(ch1);
     F[i1] = ch1;
     i1++;
 }

变成:

std::string F;
file1 >> F;

因此,用相关代码替换您的程序将导致:

#include <fstream>
#include <string>

bool compare(std::string C, std::string E)
{
    std::ifstream file1("user.txt");
    std::ifstream fil2("pass.txt");

    std::string B, F;

    file1 >> F;
    file2 >> B;

    int size1 = F.size(), size2 = B.size();
    bool flag = (C == F) &&  (E == B);

    return flag;
}

您似乎也在使用int而不是bool. 我不知道这是否是因为您使用的编译器,但如果是这样,您应该认真考虑升级。

于 2013-10-31T18:30:43.740 回答