如何删除文本文件指定行?现有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ć
相关产品推荐
相关产品推荐

