C# 将用户输入与外部文件 C# 中的数据进行比较

C# Comparing user input with data from external file C#

抱歉,如果 post 重复,但我找不到像我这样的案例 post 在此处或其他地方编辑。

我正在开发一个 C# 控制台应用程序,它应该保存用户输入然后再次读取它“类似于简单的注册和登录应用程序”。

using System;
using System.IO;

namespace Reader
{
    class Program
    {
        static void Main(string[] args)
        {
            string filepath = @"C:\myProgramingFiles\password.txt";

            StreamReader reader = File.OpenText(filepath);

            string line = reader.ReadLine();
            Console.WriteLine("Write your username:");
            string userInput = Console.ReadLine();
            Console.WriteLine("Write your password:");
            string password = Console.ReadLine();
            Console.WriteLine(userInput);
            Console.WriteLine(password);

            while(line != null)
            {
                Console.WriteLine(userInput == line);
                Console.WriteLine(password == line);
                if (userInput == line)
                {
                    Console.WriteLine("Your username is: " + line);
                }
                if(password == line)
                {
                    Console.WriteLine("Your password is: " + line);
                }
                line = reader.ReadLine();
            }
            reader.Close();
        }
    }
}

我有从 password.txt 读取数据的代码,一切正常,但是当我执行 if-else 时,它​​首先检查两个用户输入是否与用户名相同,然后检查再次循环并检查两个用户输入是否与密码相似。抱歉,如果我没说清楚,你可以 运行 这个代码,如果你想模拟 password.txt,然后检查它。

这实际上是合乎逻辑的预期结果,但问题是我不知道我还应该怎么做。你能帮帮我吗?

我试过很多东西都不行,这是我最后一次尝试,所以我知道这不是最好的代码,但它解释了问题

将以下内容放入您的文本文件中:

hello:world

将以下内容放入您的代码中:

    static void Main(string[] args)
    {
        string filepath = @"C:\myProgramingFiles\password.txt";

        Console.WriteLine("Write your username:");
        string username = Console.ReadLine();
        Console.WriteLine("Write your password:");
        string password = Console.ReadLine();

        var lines = File.ReadAllLines(filepath);

        var usrpwd = username + ":" + password;

        foreach(line in lines)
        {
            if(usrpwd == line)
                Console.WriteLine("Credentials accepted");
        }
    }

运行 应用程序并输入 hello 作为用户名和 world 作为密码。从那里开始建造..

关于在文本文件中保存新数据,请查看 File.AppendAllLines 或读入所有行,在内存中添加新数据,然后覆盖整个文件。将数据放在列表中而不是数组中可能最容易安排:

var lines = new List<string>(File.ReadAllLines(...));

然后你可以lines.Add(...)一对user:password再写出来

假设您的 password.txt 文件是这样的(看起来是这样):

password.txt

User1 
Pass123
User2
Pass456

等等

您的代码编写方式,如果用户输入 User1 作为用户名,输入 Pass123 作为密码,则输出将是:

Your username is: User1
Your password is: Pass123

但是如果同一个用户输入 User1Pass456 输出将是:

Your username is: User1
Your password is: Pass456

这显然是不可取的逻辑。

所以您需要的是使用循环检查匹配的用户名,只有满足该条件时,检查匹配的密码。

否则,如果用户输入 Pass123 作为用户名,输入 Pass456 作为密码,您甚至会得到这样的结果:

Your username is: Pass123
Your password is: Pass456

这可能是因为您没有将密码与用户名相关联。要使它们连接,您可以编写如下代码,假设用户名和密码位于不同的行:

解决方案:

while(line != null)
{
    Console.WriteLine(userInput == line);
    Console.WriteLine(password == line);

    if (userInput == line)
    {
    
// ** CHANGES BEGIN 
    
        line = reader.ReadLine(); // get password on next line
        if (line == password)
        {
            Console.WriteLine("Credentials are valid");
            
        }
        else 
        {
            Console.WriteLine("Credentials are invalid");
            
        }
        break; // no need to continue this loop
    }
    else {

        // Important: skip past password line since the username didnt match
        
        line = reader.ReadLine(); 
    }

// ** CHANGES END
    
    line = reader.ReadLine(); // this is now reading the next username or EOF
    
}