You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用StreamReader读取文本到数组时遇索引越界问题

解决C#中StreamReader读文件存数组的索引越界问题

问题根源

  1. 分割符不匹配:你代码里用制表符\t分割每行,但你的names.txt里是用空格分隔名字的,分割后数组长度不够3,访问field[1]或field[2]直接触发索引越界。
  2. 没做数组存储:循环里创建的Names对象没存到目标数组里,用完就丢了,完全没实现你要存数组的需求。
  3. 资源没妥善释放:StreamReader没套using,文件资源可能没法及时回收。

修正后的完整代码

using System;
using System.IO;

class Program
{
    public static void Main(string[] args)
    {
        Names[] namesArray = Names.Load();
        // 验证数组内容,可根据需要删除
        foreach (var name in namesArray)
        {
            if(name != null)
                Console.WriteLine($"{name.FirstName} {name.MiddleName} {name.LastName}");
        }
    }
}

class Names
{
    // 改成公共属性方便外部访问
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }

    public static Names[] Load()
    {
        // 创建指定长度的数组
        Names[] namesArray = new Names[3];
        int currentIndex = 0;

        // using自动释放文件资源,不用手动Close
        using (StreamReader file = new StreamReader("names.txt"))
        {
            string line;
            // 循环读行,同时限制不超过数组长度
            while ((line = file.ReadLine()) != null && currentIndex < namesArray.Length)
            {
                // 按空格分割,自动去掉空元素(处理连续空格)
                string[] fields = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                
                // 确保分割后有3个字段再赋值,防止越界
                if (fields.Length == 3)
                {
                    Names nameObj = new Names();
                    nameObj.FirstName = fields[0];
                    nameObj.MiddleName = fields[1];
                    nameObj.LastName = fields[2];
                    
                    namesArray[currentIndex] = nameObj;
                    currentIndex++;
                }
            }
        }

        return namesArray;
    }
}

核心修改说明

  • 分割方式调整:换成按空格分割,加上StringSplitOptions.RemoveEmptyEntries,避免连续空格导致分割出空元素的问题。
  • 数组存储逻辑:创建长度为3的Names数组,用currentIndex跟踪存储位置,确保只存3个元素。
  • 越界防护:判断分割后的字段数是否为3,符合条件才赋值,彻底避免索引越界。
  • 资源管理:用using包裹StreamReader,自动释放文件资源,比手动调用Close()更可靠。
  • 字段改属性:把Names的私有字段改成公共属性,方便后续访问数组里的内容。

内容的提问来源于stack exchange,提问作者YakobSt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:05:44