如何使用ReadLine并保留回车和换行符?

4

当从流(对我来说是一个 COM 端口上的流)读取一行时,返回的字符串中不包含 \n 或 \r 字符(或 \r\n 的组合)。为了记录日志,我想保留它们。目前我的循环看起来像这样:

 while (newPort.BytesToRead > 0)
 {
     received = ReadLine(newPort);

     response.Add(received);
 }

所以基本上我正在读取一个字符串,然后将其添加到名为response的字符串列表中。我希望返回的字符串received包含原始流中的\r或\n或\r\n,以及终止一行文本。
这是否是微不足道的可能?甚至是非微不足道的!
我猜这很难做到。我的意思是考虑一下,如果我收到一个\r,我必须获取下一个字符以查看它是否为\n。如果没有下一个字符,则会超时并引发异常。如果有下一个字符且不是\n,则必须将其作为下一次迭代的当前字符,依此类推...!

为什么不使用http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx在字符串末尾手动添加换行符呢? - Tudor
3个回答

2

在添加received之后,您可以添加Environment.NewLine

更新如果您需要保留原始空格,则使用ReadLine没有意义。在这种情况下,您可以使用ReadBlock读取文件的较小块,或者使用ReadToEnd只获取整个文件。如果您需要标记新行以处理消息,则可以搜索原始字符串以规范化、分词或执行其他操作。


2
我想知道我是否收到了单个 \n、单个 \r 还是 \r\n 组合。为了记录目的,准确地知道 COM 端口发送给我的字符非常重要。 - Robinson
是的HBC,我刚刚意识到这一点,并编写了一个使用ReadChar函数来完成它的函数。还需要测试,但我想没有简单的方式来做到这一点。 - Robinson

1

以下是问题帖子中原作者的解决方案:

好的,我试着解决了一下。这是我认为正确的做法…:

            {
                int s = 0, e = 0;

                for (; e < line.Length; e++)
                {
                    if (line[e] == '\n')
                    {
                        // \n always terminates a line.

                        lines.Add(line.Substring(s, (e - s) + 1));

                        s = e + 1;
                    }
                    if (line[e] == '\r' && (e < line.Length - 1))
                    {
                        // \r only terminates a line if it isn't followed by \n.

                        if (line[e + 1] != '\n')
                        {
                            lines.Add(line.Substring(s, (e - s) + 1));

                            s = e + 1;
                        }
                    }
                }

                // Check for trailing characters not terminated by anything.

                if (s < e)
                {
                    lines.Add(line.Substring(s, (e - s)));
                }
            }

如果原帖作者决定自己发布答案,我会删除我的帖子 :) - BartoszKP

-2
while (newPort.BytesToRead > 0)
 {
     received = ReadLine(newPort);

     response.Add(string.Format("{0}{1}", received, System.Environment.Newline);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接