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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:22:52