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

如何删除文本文件指定行?现有C#代码无法正常运行求排查

问题分析与解决方案

首先咱们来拆解你代码里的几个关键问题,这些就是导致它无法正常运行的核心原因:

  • 无限循环陷阱:你只在循环外调用了一次line = read.ReadLine(),循环内部没有更新line的值,所以当第一次读取到行内容后,line永远不会变成null,程序会一直卡在循环里跑不出来。
  • 行号计数错位:你初始化st = 1,进入循环第一行就执行st++,这样第一行的实际计数变成了2,和你预期的行号完全对应不上——比如你输入想删除第1行,代码反而会跳过第2行,完全不符合需求。
  • 丢失换行格式:拼接newtext时只是把行内容直接累加,没有保留换行符,最后写回文件的话所有内容会挤成一团,原文件的格式全乱了。
  • 未收尾的操作:你没有关闭StreamReader,可能导致文件被占用无法后续操作;而且整个代码只做了读取和拼接,最后没把修改后的内容写回原文件,等于白忙活一场。

修正后的基础版本代码

先给你修复这些问题后的代码,保留你原来的流操作思路:

try
{
    Console.Write("请输入要删除的行号:");
    if (!int.TryParse(Console.ReadLine(), out int stv))
    {
        Console.WriteLine("输入的不是有效数字!");
        return;
    }

    string filePath = "Izdelki.txt";
    string newText = string.Empty;
    int currentLine = 1;

    // 使用using语句自动释放StreamReader资源,避免文件占用
    using (StreamReader reader = File.OpenText(filePath))
    {
        string line;
        // 循环里每次读取新的一行,直到读取完毕
        while ((line = reader.ReadLine()) != null)
        {
            // 只保留非目标行的内容,同时加上换行符维持格式
            if (currentLine != stv)
            {
                newText += line + Environment.NewLine;
            }
            currentLine++;
        }
    }

    // 把修改后的内容写回原文件,注意去除末尾多余的换行
    File.WriteAllText(filePath, newText.TrimEnd(Environment.NewLine.ToCharArray()));
    Console.WriteLine("指定行已成功删除!");
}
catch (Exception ex)
{
    Console.WriteLine($"出错了:{ex.Message}");
}

更简洁的替代方案(适合学校项目)

其实.NET提供了更轻量化的文件操作方法,不用手动处理流,代码可读性更高,非常适合你的学校作业场景:

try
{
    Console.Write("请输入要删除的行号:");
    if (!int.TryParse(Console.ReadLine(), out int stv))
    {
        Console.WriteLine("输入的不是有效数字!");
        return;
    }

    string filePath = "Izdelki.txt";
    // 一次性读取所有行到数组,简化操作
    string[] allLines = File.ReadAllLines(filePath);

    // 过滤掉目标行(注意行号从1开始,数组索引从0开始,所以要减1)
    var remainingLines = allLines.Where((line, index) => index + 1 != stv).ToList();

    // 把过滤后的行写回原文件
    File.WriteAllLines(filePath, remainingLines);
    Console.WriteLine("指定行已成功删除!");
}
catch (Exception ex)
{
    Console.WriteLine($"出错了:{ex.Message}");
}

额外提醒几个细节:

  • 加入了输入校验,避免用户输入非数字导致程序崩溃
  • 增加了异常捕获,处理文件不存在、权限不足等常见问题
  • 如果你的项目文件很大,第一个流操作方案更节省内存;但学校项目的文件一般不大,第二个方案更简洁易读

内容的提问来源于stack exchange,提问作者Nihad Suljkanović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:59:31