c# - StringReader 省略尾随换行符

标签 c# .net io

我注意到在 StreamReaderStringReader 上使用 ReadLine() 时,如果文件或字符串以换行符结尾,该字符序列完全丢失。考虑以下示例:

static void Main(string[] args)
{
    string data = "First Line\r\nSecond Line\r\n\r\n\r\n";
    List<string> lineData = new List<string>();
    string[] splitData = data.Split(
        new string[] { "\r\n" }, 
        StringSplitOptions.None);

    using (StringReader sr = new StringReader(data))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
            lineData.Add(line);
    }

    Console.WriteLine("Raw Line Count: " + splitData.Length);
    Console.WriteLine("StringReader Line Count: " + lineData.Count);
    Console.WriteLine("Split Data: ");
    foreach (string s in splitData)
        Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
    Console.WriteLine("StringReader Data: ");
    foreach (string s in lineData)
        Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
    Console.ReadKey();
}

输出是这样的:

Raw Line Count: 5
StringReader Line Count: 4
Split Data:
First Line
Second Line
[blank line]
[blank line]
[blank line]
StringReader Data:
First Line
Second Line
[blank line]
[blank line]

为什么 StringReader/StreamReader 会这样?我可以想到几种解决方法,但由于读者的行为出乎意料,因此不得不重新编写我的代码似乎很愚蠢。某些 .NET 库中是否有某些设置会影响流处理最终换行符的方式?

编辑

这是另一个示例:比较运行示例时的结果,首先与 "First Line\r\nSecond Line" 比较,然后与 "First Line\r\nSecond Line\r\n “。结果完全相同(就示例的 StringReader 部分而言)。为什么 StringReader 在第二个示例中返回 null 而不是空字符串?我知道从 ReadLine() 返回的字符串不包含换行符,但为什么最后一行会被解释为 null 而不是 ""?

最佳答案

这是预期的行为并记录在案。来自 - http://msdn.microsoft.com/en-us/library/system.io.stringreader.readline.aspx .

A line is defined as a sequence of characters followed by a line feed ("\n"), a carriage return ("\r"), or a carriage return immediately followed by a line feed ("\r\n"). The string that is returned does not contain the terminating carriage return or line feed. The returned value is null if the end of the string has been reached.

意味着最后返回的值是空的,它会省略最后一个换行符。如果需要在读取数据中显示,可以通过uisng Environment.NewLine重新申请。

关于c# - StringReader 省略尾随换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19365404/

相关文章:

c# - GCHandle。如何固定包含定义为类的字段的对象

c# - 如何在不使用 XElement 的情况下从自定义 XML 序列化/反序列化为 `Dictionary<int, string>`?

java - 哪个 Java IO 类更适合用于简单的 shell 解释器?

c# - 服务器中的 zip 文件

c# - 管理 Access 数据库的路径

.net - 我将如何使用正则表达式将 HTML 解析为纯文本

.net - 更改运行 Windows 窗体程序的用户

c - 逻辑和物理 I/O 之间的区别?

java - 创建文件夹有效,但权限未继承

c# - 通用数字类型