如何读取和保留回车符和换行符
本文关键字:保留 回车 换行符 何读取 读取 | 更新日期: 2023-09-27 18:37:13
当读取流上的一行时(对我来说,它实际上是COM端口上的流),返回的字符串不包含'或''r字符(或''r'组合)。 出于日志记录目的,我想保留它们。 目前我的循环如下所示:
while (newPort.BytesToRead > 0)
{
received = ReadLine(newPort);
response.Add(received);
}
所以基本上我正在读取一个字符串,然后将其添加到名为 response
的字符串列表中。我想要的是返回的字符串received
包含原始流中的''r或'或''r',以及终止一行文本。
这是微不足道的可能吗? 甚至不平凡!
我猜这很难做到。 我的意思是考虑一下,如果我收到一个''r,我必须得到下一个字符,看看它是否是一个'。 如果没有下一个字符,我将超时并出现异常。如果有下一个字符并且它不是',我必须在下一次迭代中使其成为当前字符,依此类推...!
您可以在
添加received
后附加Environment.NewLine
。
更新 如果您需要逐字保留原始空格,那么使用 ReadLine
是没有意义的。在这种情况下,您可以使用ReadBlock
来读取文件的较小块,或者ReadToEnd
来获取整个内容。如果需要标记新行来处理消息,可以搜索原始字符串以进行规范化或标记化或任何您想要执行的操作。
以下是问题帖子中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)));
}
}
while (newPort.BytesToRead > 0)
{
received = ReadLine(newPort);
response.Add(string.Format("{0}{1}", received, System.Environment.Newline);
}