我有一个检查用户名和密码的功能。我有两个文本文件,一个用于单行用户名,另一个用于单行密码。然后我从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;
}
即使用户名和密码正确,它也会输出错误的输出。错误在哪里?
答案 0 :(得分:0)
简单来说,只有当我们尝试读取文件末尾(超过文件大小)时,eof()才返回true。 所以你应该按如下方式更改代码:
while(true)
{
fil1.get(ch1);
if(fil1.eof())
break;
F[i1]=ch1;
i1++;
}
答案 1 :(得分:0)
考虑到你的“user.txt”里面有“user”文字。您将使用双尾符号'r'的F =“userr”,因为fil.eof()仅在尝试读取文件末尾时才返回true。正确的循环是:
while(fil1.get(ch1)) {
F[i1] = ch1;
i1++;
}
第二次循环相同。
答案 2 :(得分: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
。我不知道这是否是因为您使用的编译器,但如果是这样,您应该认真考虑升级。