C#使用StreamReader读取文本到数组时遇索引越界问题
解决C#中StreamReader读文件存数组的索引越界问题
问题根源
- 分割符不匹配:你代码里用制表符
\t分割每行,但你的names.txt里是用空格分隔名字的,分割后数组长度不够3,访问field[1]或field[2]直接触发索引越界。 - 没做数组存储:循环里创建的
Names对象没存到目标数组里,用完就丢了,完全没实现你要存数组的需求。 - 资源没妥善释放:
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
相关产品推荐
相关产品推荐

