【问题标题】:How to ReadLine and retain the carriage returns and line feeds?如何读取并保留回车和换行符?
【发布时间】:2012-06-15 11:59:18
【问题描述】:

读取流上的一行时(对我来说,它实际上是 COM 端口上的流),返回的字符串不包含 \n 或 \r 字符(或 \r\n 组合)。出于记录目的,我想保留它们。目前我的循环如下所示:

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

     response.Add(received);
 }

所以基本上我正在读取一个字符串,然后将其添加到一个名为response 的字符串列表中。我想要的是返回的字符串 received 包含原始流中的 \r 或 \n 或 \r\n ,以及终止一行文本。

这有可能吗?甚至不平凡!

我猜这很难做到。我的意思是考虑一下,如果我收到一个\r,我必须获取下一个字符来查看它是否是\n。如果没有下一个字符,我将超时并出现异常。如果有下一个字符但不是 \n,我必须在下一次迭代中将其设为当前字符,依此类推...!

【问题讨论】:

标签: c# readline


【解决方案1】:

您可以在添加received 后附加Environment.NewLine

更新如果您需要逐字保留原始空格,那么使用ReadLine 毫无意义。在这种情况下,您可以使用ReadBlock 来读取文件的较小块,或者使用ReadToEnd 来获取整个内容。如果您需要标记新行来处理消息,您可以搜索原始字符串以进行规范化或标记化或您想做的任何事情。

【讨论】:

  • 我想知道我收到的是单个\n、单个\r 还是\r\n 组合。准确地知道 COM 端口向我发送了哪些字符以用于日志记录,这一点很重要。
  • 是的 HBC,我刚刚意识到这一点,并编写了一个函数来使用 ReadChar 来完成。仍然需要对其进行测试,但我想没有简单的方法可以做到。
【解决方案2】:

这是问题帖子中OP的解决方案:

好的,我对此有所了解。这是我认为是正确的...:

            {
                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)));
                }
            }

【讨论】:

  • 如果 OP 决定自己发布答案,我将删除我的帖子 :)
【解决方案3】:
while (newPort.BytesToRead > 0)
 {
     received = ReadLine(newPort);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2013-01-09
    相关资源
    最近更新 更多