首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringReader省略尾部换行符

StringReader省略尾部换行符
EN

Stack Overflow用户
提问于 2013-10-15 01:03:20
回答 3查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
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();
}

输出如下:

代码语言:javascript
复制
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而不是""

EN

回答 3

Stack Overflow用户

发布于 2013-10-15 01:15:01

输出的不同并不是因为StringReader的奇怪行为。请注意,您的输入只包含四行,并且恰好有四行正在被读取(只是没有结束换行符,由documentation指定)。Split方法引入了额外的一行-因为如果您希望保留空条目,则会在最后一个令牌之后创建一个不存在的条目。

StringReader的输出

代码语言:javascript
复制
"First Line\r\nSecond Line\r\n\r\n\r\n";
 ^1st          ^2nd           ^3rd^4th   (line)

Split的输出

代码语言:javascript
复制
"First Line\r\nSecond Line\r\n\r\n\r\n";
 ^1st          ^2nd           ^3rd^4th^5th (token)

请考虑以下输入:

代码语言:javascript
复制
"First line\r\n"

它有多少行?1,这就是输出:

代码语言:javascript
复制
Split Data:
First Line
[blank line]
StringReader Data:
First Line

所以看起来Split才是这里的“问题”(如果有问题的话)。

Douglas在下面的评论中描述了真正的问题,它是像"ABC\r\nXYZ""ABC\r\nXYZ\r\n"这样的输入是无法区分的。但是,在ReadLine接口的典型用例中,您并不关心这一点。如果你想关心,你需要在一个更低的级别上使用一个接口(例如Read)。

票数 3
EN

Stack Overflow用户

发布于 2013-10-15 01:12:02

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

将行定义为一系列字符,后跟换行符("\n")、回车("\r")或紧跟换行符("\r\n")的回车。返回的字符串不包含终止回车符或换行符。如果已到达字符串末尾,则返回值为null。

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

票数 2
EN

Stack Overflow用户

发布于 2013-10-15 01:14:13

ReadLine上的每个文档

将行定义为一系列字符,后跟换行符("\n")、回车("\r")或紧跟换行符("\r\n")的回车。返回的字符串不包含终止回车符或换行符。如果到达输入流的末尾,则返回值为null。

您正在使用一个依赖于Environment.NewLine的方法来标记化输入流并返回结果。由于这些标记被排除在结果之外,因此理所当然地认为预期的行为就是您所看到的。

如果需要这些字符,最好是分块读取文件(使用带缓冲区的标准Read ),然后自己分解内容。或者,您可以创建自己的Stream实现来执行您想要的任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19365404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档