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,我必须在下一次迭代中将其设为当前字符,依此类推......!

4

3 回答 3

2

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

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

于 2012-06-15T12:01:24.977 回答
1

这是问题帖子中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)));
                }
            }
于 2018-06-18T09:11:38.497 回答
-2
while (newPort.BytesToRead > 0)
 {
     received = ReadLine(newPort);

     response.Add(string.Format("{0}{1}", received, System.Environment.Newline);
 }
于 2012-06-15T12:05:31.537 回答