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

C#统计txt文件行、字符、元音辅音运行报错问题求解

问题背景

尝试开发C#程序实现txt文件的总行数、总字符数、元音字母数、辅音字母数统计功能,程序运行/编译时报错,尝试将相关方法修改为静态方法后问题未解决。

问题根因排查
  • 调用规则不匹配:实例方法不能直接通过类名静态调用,FindFileAndWork是Continut类的实例方法,主程序中直接通过类名Continut.FindFileAndWork(filePath)调用,会直接触发编译错误,这是最核心的运行失败原因。如果要改成静态方法,类内所有被方法访问的计数字段、元音字符串变量也必须同步改成静态,仅修改方法修饰符不生效。
  • 构造函数逻辑错误:Continut构造函数接收外部传入的fileName参数后,没有将参数赋值给类的私有字段,反而执行fileName = Console.ReadLine()重新读取控制台输入,既覆盖了外部传入的有效路径,也造成重复读取输入的逻辑问题。
  • 元音集合拼写错误:存储元音的变量vocale赋值为"aeiouAeiou",大写元音漏写E、I、O、U,会导致大写的E/I/O/U被错误统计为辅音。
  • 资源泄漏风险:StreamReader使用后未做释放处理,可能触发文件被占用、内存泄漏问题。
  • 提示文案错误:文件不存在时输出"Folder dosen't exists",存在拼写错误,且混淆了文件和文件夹概念。
  • 无结果输出逻辑:所有计数字段都是类的私有字段,统计完成后没有对外输出或暴露结果的逻辑,即使统计逻辑跑通,用户也看不到任何结果。
  • 字符统计偏差:nrtotalcharacters仅累加每行文本的长度,没有计入换行符长度,统计结果和文件实际总字符数存在偏差。
修复后完整代码

Continut类

public class Continut
{
    // 统计相关私有字段
    private int _nrLines = 0;
    private int _nrVowels = 0;
    private int _nrTotalCharacters = 0;
    private int _nrConsonants = 0;
    // 补全所有大小写元音
    private readonly string _vowels = "aeiouAEIOU";
    private readonly string _targetFilePath;

    // 构造函数:正确接收外部传入的文件路径,不再重复读取控制台输入
    public Continut(string filePath)
    {
        _targetFilePath = filePath;
    }

    static bool IsLetter(char c)
    {
        return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
    }

    // 执行文件统计逻辑
    public void CalculateStats()
    {
        if (!File.Exists(_targetFilePath))
        {
            Console.WriteLine("错误:指定的txt文件不存在");
            return;
        }
        // using语句自动释放文件流资源
        using (StreamReader reader = new StreamReader(_targetFilePath))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                _nrLines++;
                // 累加行长度+系统对应换行符长度
                _nrTotalCharacters += line.Length + Environment.NewLine.Length;
                foreach (char c in line)
                {
                    if (!IsLetter(c)) continue;
                    if (_vowels.IndexOf(c) != -1)
                    {
                        _nrVowels++;
                    }
                    else
                    {
                        _nrConsonants++;
                    }
                }
            }
            // 最后一行末尾无换行符,减去多算的换行长度
            if (_nrLines > 0)
            {
                _nrTotalCharacters -= Environment.NewLine.Length;
            }
        }
    }

    // 输出统计结果
    public void PrintStats()
    {
        Console.WriteLine("=== 文件统计结果 ===");
        Console.WriteLine($"总行数:{_nrLines}");
        Console.WriteLine($"总字符数:{_nrTotalCharacters}");
        Console.WriteLine($"元音字母数:{_nrVowels}");
        Console.WriteLine($"辅音字母数:{_nrConsonants}");
    }
}

主程序入口

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("请输入待统计的txt文件完整路径:");
        string filePath = Console.ReadLine()?.Trim() ?? string.Empty;
        if (string.IsNullOrWhiteSpace(filePath))
        {
            Console.WriteLine("错误:文件路径不能为空");
            return;
        }
        // 先实例化统计类,再调用实例方法
        Continut stats = new Continut(filePath);
        stats.CalculateStats();
        stats.PrintStats();
    }
}
关键修复点说明
  • 调整调用逻辑:主程序中先创建Continut类的实例,传入读取到的文件路径,再依次调用统计方法、结果输出方法,解决实例方法静态调用的编译错误。如果需要用静态方法实现,只需将类中所有被CalculateStats访问的字段改为静态,同时将CalculateStats、PrintStats加static修饰符即可,实例化实现的封装性更好。
  • 修正构造函数赋值逻辑,删除构造函数中多余的Console.ReadLine()调用,确保外部传入的路径正确传递到类内部。
  • 补全元音集合中缺失的大写元音字符,修正元音、辅音统计错误。
  • 用using语句包裹StreamReader,确保文件读取完成后资源自动释放,避免文件占用问题。
  • 修正错误提示文案,明确提示文件不存在的错误,修正拼写和概念错误。
  • 新增结果输出方法,统计完成后直接打印所有统计项,解决程序运行无输出的问题。
  • 优化总字符数统计逻辑,计入系统对应长度的换行符,同时修正最后一行多算换行符的偏差,统计结果更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:54:26