StreamReader.ReadLine()为何忽略换行符?技术求助
为什么StreamReader.ReadLine()会忽略文本换行符,导致段落合并?
你碰到的问题其实是StreamReader.ReadLine()的设计特性导致的——这个方法读取一行内容时,会自动丢弃每行末尾的换行符,甚至连那些只包含换行符的空白行,读取后也会变成空字符串。你现在的代码只是把读取到的每行内容直接拼接,完全没把换行符加回去,自然原本的段落分隔就消失了,所有内容挤成了一大段。
咱们来拆解下你的代码逻辑:
当你读取空白行时,currentLine会是空字符串,你直接把它加到m_content里,相当于什么都没加;而读取非空白行时,也只加了行内容,没加原本的换行符,所以所有行都连在一起了。
这里给你两个解决思路:
1. 手动补充换行符(简单直接)
修改循环逻辑,每次读取后把换行符加回去,这样就能还原文件里的换行和空白行:
currentLine = sr.ReadLine(); while (currentLine != "[/CONTENT]") { // 先加当前行内容,再补上换行符 m_content += currentLine + Environment.NewLine; currentLine = sr.ReadLine(); }
Environment.NewLine会根据系统自动用合适的换行符(Windows是\r\n,Linux是\n),比硬编码更通用。
2. 用StringBuilder优化性能(适合大文件)
如果你的文本文件比较大,多次字符串拼接会有性能损耗,推荐用StringBuilder来处理,它的AppendLine()方法会自动帮你加换行符:
System.Text.StringBuilder contentBuilder = new System.Text.StringBuilder(); currentLine = sr.ReadLine(); while (currentLine != "[/CONTENT]") { contentBuilder.AppendLine(currentLine); currentLine = sr.ReadLine(); } m_content = contentBuilder.ToString();
这个方法不仅能保留所有换行和空白行,还比直接拼接字符串高效得多。
另外你提到可以显式处理——其实上面的两种方式已经帮你做到了:当读取到空白行时,currentLine是空字符串,AppendLine()或者手动加Environment.NewLine后,就会在内容里生成一个空的换行,完美保留原文件的段落分隔。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

