C#使用StreamReader读取Txt到数组遇问题:输出所有Token而非目标行
问题分析与修复方案
我懂你的困扰——本来想读取包含目标名称的整行数据,把11个整数存入数组并按年份对应打印,结果却输出了所有行的每个数字token。咱们来拆解代码里的问题,一步步修复:
原代码的核心问题
- 逻辑顺序错位:你先读了第一行判断是否包含目标名称,但之后不管有没有找到,直接进入while循环处理所有行的token,导致无关行的数字也被打印出来。
- 打印逻辑混乱:在foreach循环里每解析一个整数就打印一行,而不是等整行的11个数字都处理完后,按年份对应整行输出。
- 数组存储逻辑漏洞:每次循环都会重置
arrayIndex = 0,导致nums数组始终只存最后一行的数字,而不是目标行的11个值。
修复后的代码
public class SSA { public void Search() { Console.WriteLine("Name to search for?"); string n = Console.ReadLine(); Search(n, "Files/Names_Long.txt"); } public int[] Search(string targetName, string fileName) { int[] nums = new int[11]; char[] delimiters = { ' ', '\n', '\t', '\r' }; bool found = false; // 标记是否找到目标行 using (TextReader sample2 = new StreamReader("Files/Exercise_Files/SSA_Names_Long.txt")) { string currentLine; // 逐行遍历,找到目标行再处理 while ((currentLine = sample2.ReadLine()) != null) { if (currentLine.Contains(targetName)) { Console.WriteLine($"Found {targetName}!"); Console.WriteLine("Year\tRank"); string[] tokensFromLine = currentLine.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); int arrayIndex = 0; int year = 1900; // 提取当前行的整数,存入数组并按年份对应打印 foreach (string token in tokensFromLine) { int arrval; if (int.TryParse(token, out arrval) && arrayIndex < 11) { // 防止数组越界 nums[arrayIndex] = arrval; Console.WriteLine($"{year}\t{arrval}"); year += 10; arrayIndex++; } } found = true; break; // 只找第一个匹配行就跳出,要找所有匹配就去掉这句 } } if (!found) { Console.WriteLine($"{targetName} was not found!"); } } return nums; } }
关键修改说明
- 调整遍历逻辑:先逐行读取,找到包含
targetName的行后才进行token拆分和数据处理,彻底避免处理无关行。 - 添加找到标记:用
found变量记录是否找到目标,循环结束后再提示未找到的信息,解决原代码只判断第一行就输出提示的问题。 - 防止数组越界:添加
arrayIndex < 11的判断,避免行内整数数量超过数组长度时抛出异常。 - 修复打印逻辑:只在找到目标行时才打印年份和排名,每个整数对应一个年份,一次性输出该行的完整数据。
这样修改后,程序就会精准处理包含目标名称的那一行,把11个整数存入数组,并按年份对应打印整行的数据,不会再乱输出所有token啦。
内容的提问来源于stack exchange,提问作者pijoborde
相关产品推荐
相关产品推荐

