C#跨窗体传用户名后,如何用StreamReader读取指定条目显示数组第5元素?
修正后的C#代码实现需求
我帮你梳理下原代码里的几个关键问题,然后给出能完美实现需求的修正版本:
原代码的核心问题
- 你初始化的
user列表是空的,所以user.Contains(username)这个判断永远不会成立,直接跳过了核心的文件读取和匹配逻辑 - 逻辑顺序搞反了:应该先读取文件内容,再去匹配目标用户名,而不是先判断一个空列表
- 没有正确处理文件流的资源释放,容易导致资源泄漏
- 数组索引搞错了:C#里数组是从0开始计数的,你要的第5个元素对应的索引是
4(不是5) - 没考虑到
account.txt的格式是一行包含多个用户的信息,每个用户占6个字段,需要按组遍历查找
修正后的完整代码
private void Balance_Load(object sender, EventArgs e) { // 获取登录窗体传递的用户名 string targetUsername = login.accountname; // 使用using语句自动管理StreamReader资源,避免文件流泄漏 using (StreamReader sr = new StreamReader("account.txt")) { // 读取文件全部内容(因为你的文件是单行格式) string fullContent = sr.ReadToEnd(); // 分割所有字段,自动移除空字符串 string[] allFields = fullContent.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 按每个用户6个字段的规则遍历查找 for (int i = 0; i < allFields.Length; i += 6) { // 匹配到目标用户名 if (allFields[i].Equals(targetUsername, StringComparison.OrdinalIgnoreCase)) { // 第5个元素对应索引i+4(从0开始计数:i是第1个字段,i+4是第5个) label3.Text = allFields[i + 4]; // 找到后直接退出循环,无需继续遍历 break; } } } }
关键修正说明
- 用
using包裹StreamReader:确保文件流在使用完成后自动关闭,不需要手动调用Close(),避免资源泄漏 - 适配单行文件格式:因为你的
account.txt是一行包含所有用户数据,所以用ReadToEnd()一次性读取后再分割 - 按用户字段组遍历:每个用户占6个字段,所以每次循环步长设为6,精准匹配每个用户的起始位置
- 索引修正:第5个元素对应的数组索引是
i+4(数组从0开始,第1个元素索引为i,第5个就是i+4) - 增加字符串匹配的容错性:用
StringComparison.OrdinalIgnoreCase可以忽略大小写匹配(如果不需要可以去掉,改成直接==)
内容的提问来源于stack exchange,提问作者Seow
相关产品推荐
相关产品推荐

