如何循环遍历文件来获取数据?

2024-04-23

我正在尝试进行基本登录并注册 C# 控制台应用程序,但是,我需要循环遍历我的文件以查看用户输入的用户名和密码在登录时是否匹配。如果用户输入用户名和密码,我希望我的代码遍历我的文件以检查它是否是现有的用户名和密码

这是我的代码:

[Serializable]
public class Users
{
    public string UserName;
    public string Password;

    public Users(string userName, string password)
    {
        UserName = userName;
        Password = password;
    }
}

public class SaveToFile
{
    public static void SerializeSignUpDetails(string userName, string password)
    {
        Users obj = new Users(userName, password);
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream("SignUp.txt", FileMode.Append, FileAccess.Write);
        formatter.Serialize(stream, obj);
        stream.Close();
    }
    public static Users DeserializeSignUpDetails()
    {
        Stream stream = new FileStream("SignUp.txt", FileMode.Open, FileAccess.Read);
        IFormatter formatter = new BinaryFormatter();
        Users objnew = (Users)formatter.Deserialize(stream);
        stream.Close();
        return objnew;
    }
}

public static void Main(string[] args)
{
    Console.WriteLine("To Login Type 1, To Create a new account Type 2");
    int LogInOrSignUp;
    do
    {
        int.TryParse(Console.ReadLine(), out LogInOrSignUp);
    } while (LogInOrSignUp != 1 && LogInOrSignUp != 2);

    string userName = "";
    string password = "";
    bool successfull = false;
    Users userDetails = SaveToFile.DeserializeSignUpDetails();
    while (!successfull)
    {
        if (LogInOrSignUp == 1)
        {
            Console.WriteLine("Write your username:");
            userName = Console.ReadLine();
            Console.WriteLine("Enter your password:");
            password = Console.ReadLine();
            if (userName == userDetails.UserName && password == userDetails.Password)
            {
                Console.WriteLine("You have logged in successfully!");
                successfull = true;
                break;
            }
            if (!successfull)
            {
                Console.WriteLine("Your username or password is incorect, try again!");
            }
        }

        else if (LogInOrSignUp == 2)
        {
            Console.WriteLine("Enter a username:");
            userName = Console.ReadLine();

            Console.WriteLine("Enter a password:");
            password = Console.ReadLine();

            successfull = true;
            SaveToFile.SerializeSignUpDetails(userName, password);
        }
    }
}

我想使用 foreach 循环遍历我的文件,但我不知道如何操作。

任何帮助表示赞赏!


要使用序列化保留多个条目的登录记录,您需要序列化对象列表。在您的情况下,您可以创建几个可序列化的类,User封装单个条目的数据的类,以及Users包含一个类List<User>对象加上数据操作方法。

✔ Note: Name as you prefer.

要导入的命名空间

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

The User class

[Serializable]
public class User
{
    public string UserName { get; set; }
    public string Password { get; set; }
    //More details...

    public User(string userName, string password)
    {
        UserName = userName;
        Password = password;
    }

    public override string ToString() => $"{UserName}, {Password}";
}

The Users class

[Serializable]
public class Users
{
    public readonly List<User> Accounts;

    public Users() => Accounts = new List<User>();

    public void Save(string filePath)
    {
        if (string.IsNullOrEmpty(filePath)) return;

        var bf = new BinaryFormatter();
        using (var fs = new FileStream(filePath, FileMode.Create))
            bf.Serialize(fs, this);
    }

    public static Users Load(string filePath)
    {
        if (!File.Exists(filePath)) return null;

        var bf = new BinaryFormatter();
        using (var sr = new FileStream(filePath, FileMode.Open))
            return bf.Deserialize(sr) as Users;
    }

    public bool ContainsUserName(string userName) => 
        Accounts.Any(x => x.UserName == userName);

    public bool ContainsAccount(string userName, string pass) =>
        Accounts.Any(x => x.UserName == userName && x.Password == pass);

    public User Get(string userName, string pass) =>
        Accounts.FirstOrDefault(x => x.UserName == userName && x.Password == pass);

    public bool Add(string userName, string pass)
    {
        if (ContainsUserName(userName)) return false;

        Accounts.Add(new User(userName, pass));
        return true;
    }
}

在您的实现中,创建、加载和保存数据:

//Load...
users = Users.Load(dataFilePath);

//Or create new object...
if (users is null)
    users = new Users();

//and when it comes to save...
users.Save(dataFilePath);

Use the ContainsUserName方法来查明给定的用户名是否已经存在,这样就可以避免重复。这Add方法将执行相同的操作,并且会将有效的新条目添加到列表中。这Get方法在列表中搜索给定的用户名和密码并返回User如有其他情况则反对null,以及ContainsAccount如果您不需要返回,方法将执行相同的操作User object.

var user = users.Get("user", "pass");
if (user is null)
    Console.WriteLine("Incorrect username and/or password...");

//or
if (!users.ContainsAccount("user", "pass"))
    Console.WriteLine("Incorrect username and/or password...");

将其应用到你的main:

public static void Main(string[] args)
{
    Console.WriteLine("To Login Type 1, To Create a new account Type 2");
    int LogInOrSignUp;
    do
    {
        int.TryParse(Console.ReadLine(), out LogInOrSignUp);
    } while (LogInOrSignUp != 1 && LogInOrSignUp != 2);

    var filePath = Path.Combine(AppContext.BaseDirectory, "SignUp.dat");
    var userName = "";
    var password = "";
    var successfull = false;
    var userDetails = Users.Load(filePath);

    if (userDetails is null)
        userDetails = new Users();

    while (!successfull)
    {
        if (LogInOrSignUp == 1)
        {
            Console.WriteLine("Write your username:");
            userName = Console.ReadLine();
            Console.WriteLine("Enter your password:");
            password = Console.ReadLine();
            if (userDetails.ContainsAccount(userName, password))
            {
                Console.WriteLine("You have logged in successfully!");
                successfull = true;
                break;
            }
            else
                Console.WriteLine("Your username or password is incorect, try again!");
        }

        else //if (LogInOrSignUp == 2)
        {
            Console.WriteLine("Enter a username:");
            userName = Console.ReadLine();

            if (userDetails.ContainsUserName(userName))
                Console.WriteLine("The username is taken. Try another one.");
            else
            {
                Console.WriteLine("Enter a password:");
                password = Console.ReadLine();

                successfull = true;
                userDetails.Add(userName, password);
                userDetails.Save(filePath);
                Console.WriteLine($"A new account for {userName} has been created.");
            }
        }
    }
    Console.ReadLine();
}

✔ Note: Better to use the switch https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch statement to select LogInOrSignUp instead of the if statements

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何循环遍历文件来获取数据? 的相关文章

  • Word Automation - 禁用警报

    我正在自动化 Word 因此我想抑制所有警报 Word Application word new Word Application word DisplayAlerts Microsoft Office Interop Word WdAle
  • Boost.Intrusive 和 unordered_map

    我希望使用侵入性的 unordered map 由于某种原因 库中只有一个 unordered set 还有一个侵入式哈希表 但我不确定它是否具有相同的功能 而且它没有相同的接口 我错了吗 我错过了 unordered map 链接吗 如果
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 将 XML 转换为 JSON 时保留 json:Array 属性

    我有一段 XML 看起来像
  • 同步和异步 API

    我正在开发一个库 它提供一些耗时的服务 我需要每个 API 有两个版本 一个用于同步函数调用 另一个用于异步 图书馆用户应决定使用哪个版本 服务结果可能对于系统继续运行 同步调用 至关重要 可能需要在不同的工作线程中完成相同的操作 因为结果
  • 创建新视图时如何初始化视图模型中的属性?

    我有一个应用程序 可以打开一个视图 允许您搜索数据 然而 为了进行搜索 用户必须选择他想要在什么类别下进行搜索 目前 我正在尝试弄清楚如何将所选类别从主视图模型 作为 int 传递到新搜索视图的视图模型 目前我正在尝试在主视图中使用类似的东
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 如何在 .NET Core 中设置全局环境变量(用户范围或系统范围)

    在完整的 NET中我们可以通过EnvironmentVariableTarget枚举到Environment SetEnvironmentVariable call public enum EnvironmentVariableTarget
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • c++ string::size 中的 CharT 元素是什么?

    From http en cppreference com w cpp string basic string size http en cppreference com w cpp string basic string size 的数量
  • 在 C# 中同步闪烁标签

    我创建了一个BlinkingLabel类 源自Forms Label 其中有一个Forms Timer这允许我启用和禁用闪烁效果 我创建了 4 个标签BlinkingLabel类型 我的问题是 如果所有 4 个标签在不同时间闪烁 则闪烁效果
  • 显示具有相同节点值的多个 XML 数据条目

    我有一个 XML 文档 其中包含课程信息 如下所示
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 我试图使这段代码递归,但由于某种原因它不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图使这
  • 多线程文件写入

    我正在尝试使用多个线程写入大文件的不同部分 就像分段文件下载器所做的那样 我的问题是 执行此操作的安全方法是什么 我是否打开文件进行写入 创建线程 将 Stream 对象传递给每个线程 我不希望发生错误 因为多个线程可能同时访问同一个对象
  • 如何使用va_start()?

    在具有可变参数的函数中 我们使用函数 va start 初始化 va list ap 类型的对象 如下所示 void va start va list ap parmN 我不明白1 什么类型的对象可以作为 parMN 最后一个已知参数 传递
  • C# StreamReader 使用分隔符保存到数组

    我有一个文本文件 其中包含制表符分隔的数据 我在 C 应用程序中需要的是从文本文件中读取一行并将它们保存到一个数组中 在每个位置将它们分开 t 然后我对下一行做同样的事情 My code StreamReader sr new Stream
  • 实现“计时器”的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 实现计时器的最佳方法是什么 代码示例会很棒 对于这个问题 最佳 被定义为最可靠 失火次数最少 和最精确 如果我指定 15 秒的间隔 我希望每 15 秒调用一次目标方法 而不是每 10 20 秒调用一次 另一方面
  • 通过网络共享的 SQL CE

    我之前见过这个问题 但找不到关于什么是可能 不可能以及什么解决方法可能可用的明确解释 我有一个现有的 C 应用程序 它使用 SQL CE 来存储本地信息 该数据库只能由单个应用程序访问 并存储在用户的 appdata 文件夹中 某些环境将

随机推荐

  • 在单独的项目中创建单元测试是 Android 的正确方法吗?

    关于如何开始在 Android 中进行测试的描述似乎不一致 http developer android com guide topics testing testing android html http developer androi
  • 使用IdentityServer3调用Web API时出现401未经授权

    我正在尝试使用 IdentityServer3 和客户端凭据流程来设置一个简单的示例 该示例包含一个控制台客户端 使用从 IdentityServer 接收的令牌调用 Web API 资源 Web API 和 IdentityServer
  • 如何让ChildWindow阻塞

    ChildWindow是一个模态窗口 但它不会阻塞 有什么办法让它阻塞吗 我基本上想要一个 ShowDialog 方法 该方法将调用 ChildWindow Show 但直到用户关闭 ChildWindow 后才会返回 我尝试使用 Moni
  • 在c# Visual Studio中编译协议缓冲区3时间戳类型?

    Visual Studio 2015 C NuGet Packages Google Protobuf v3 0 0 Google Protobuf Tools v3 0 0 消息类型Quake syntax proto3 import g
  • 休眠批量插入-刷新如何工作?

    我需要使用 hibernate 在数据库中插入大量数据 我正在查看 hibernate 的批量插入 我使用的类似于手册上的示例 Session session sessionFactory openSession Transaction t
  • Kivy 弹出窗口在单独的线程中运行

    我正在 Kivy 中填充一个树视图 这需要一些时间 具体取决于它的大小 在树很大并且需要一段时间的情况下 我想在填充时显示一个弹出窗口 以便用户知道程序尚未冻结 并在填充树的逻辑完成时关闭此弹出窗口 这是我通过对该主题的一些研究得出的结论
  • 将坐标列表转换为元组列表

    我正在尝试将坐标列表转换为元组列表 from a list 56 78 72 67 55 66 to list of tuples 56 78 72 67 55 66 我尝试执行 for in 循环将 a list 中的每个元素转换为元组
  • 与枚举和可选元组关联值进行 Swift 模式匹配

    我目前正在使用 Alamofire 并使用枚举来描述我按照自述文件中的建议使用的 API 端点表示如下 public enum API case GetStops stopCode String case GetPhysicalStops
  • 2个JS函数同名冲突

    Short 在同一页面使用 2 个库 jQuery UI 和 Twitter Bootstrap jQuery UI 对我来说非常重要 因为几乎所有的 UI 东西都是基于它构建的 Twitter Bootstrap 仅适用于带下拉菜单的拆分
  • 如何通过拖动扩展窗口框架来使 WPF 窗口可移动?

    在 Windows 资源管理器和 Internet Explorer 等应用程序中 人们可以抓住标题栏下方的扩展框架区域并拖动窗口 对于 WinForms 应用程序 窗体和控件尽可能接近本机 Win32 API 一个人会简单地覆盖WndPr
  • 总和投影和结果约束

    我在数据库中有 100 个实体 我想获取前 20 个实体的某些属性的总和 Criteria cr getSession createCriteria Entity class cr setFirstResult 0 cr setMaxRes
  • ggplot 中的躲避/替换/排斥轴刻度标签?

    如果没有大量工作 我想要的可能是不可能的 但也许有人有解决方案 我有一个如下图 当然这是一个过于简单的示例 其中我的刻度标签彼此非常接近 dd lt data frame x 1 4 y c 10 10 5 10 6 10 7 z LETT
  • python 如何在嵌套列表中搜索项目

    假设我有这个清单 li 0 20 ar 20 40 asdasd 50 199 bar 24 69 sarkozy 现在 忘掉数字吧 它们让我能够识别字符串的位置 所以基本上 鉴于我手头有字符串 ar 我如何提取包含 ar 的所有列表 ne
  • 将 MATLAB 单元格类型转换为 C++

    我正在使用 C 转换 MATLAB 程序犰狳 http arma sourceforge net docs html syntax对于矩阵代数 我被困住了cell http blogs mathworks com loren 2006 06
  • wxGrid 在右侧显示大的空白边框

    默认情况下 wxGrid 在最后一列之后的右侧显示一个小的 10 像素 空白边框 调用 SetMargins 对其没有任何影响 这很烦人 但我可以忍受 但是 如果我将行标签宽度设置为零 则空白边框会变得更大 如果我只有一列 效果会很糟糕 看
  • 送达收据请求不适用于 XMPP Android (aSmack)

    我正在使用 OpenFire 和 aSmack 我似乎无法让 送货收据 正常工作 创建连接时我执行以下操作 create connection connection login username password DeliveryRecei
  • c++ 打开文件的问题

    必须是一个简单的答案 但我不知所措 这是返回错误的代码 我尝试过带或不带起始斜杠 我不知道完整路径 我希望它是相对于exe的 这就是相对路径 我试图逃避斜线 我的问题是当文件存在时我收到 打开文件时出错 为什么它失败了 ifstream m
  • 如何编写恒定时间函数将最高有效位复制到所有位

    我想用 C 语言编写一个函数 它采用以下的 MSBuint8 t 如果已设置 则返回0xFF如果不0x00 简而言之 它返回一个整数 其中所有位都设置为与 MSB 相同的值 但我想以完全恒定的时间方式来完成它 没有分支 没有数组偏移 只是数
  • jq - 过滤器数组不包含

    我正在使用应用程序 jq 从命令行过滤 json 文件 https stedolan github io jq https stedolan github io jq 这是一个代表问题的糟糕例子 如何过滤该集合以包含所有非红色或非圆形的水果
  • 如何循环遍历文件来获取数据?

    我正在尝试进行基本登录并注册 C 控制台应用程序 但是 我需要循环遍历我的文件以查看用户输入的用户名和密码在登录时是否匹配 如果用户输入用户名和密码 我希望我的代码遍历我的文件以检查它是否是现有的用户名和密码 这是我的代码 Serializ