流读线

pro*_*cma 3 c# newline streamreader tfilestream

我有一个逐行读取的流阅读器sr.ReadLine().我的代码用行结尾\r\n和/或来计算行尾\n.

        StreamReader sr = new System.IO.StreamReader(sPath, enc);

        while (!sr.EndOfStream)
        {
            // reading 1 line of datafile
            string sLine = sr.ReadLine();
            ...
Run Code Online (Sandbox Code Playgroud)

如何告诉代码(而不是通用sr.ReadLine())我想要计算新行只有一个完整\r\n而不是\n

And*_*yev 6

使用StreamReader.ReadLine无法执行此操作.根据msdn:

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

因此,只有在你捕获了\ r \n时,你才必须逐字节地读取这个流并返回行

编辑

这是一些代码示例

private static IEnumerable<string> ReadLines(StreamReader stream)
{
    StringBuilder sb = new StringBuilder();

    int symbol = stream.Peek();
    while (symbol != -1)
    {
        symbol = stream.Read();
        if (symbol == 13 && stream.Peek() == 10)
        {
            stream.Read();

            string line = sb.ToString();
            sb.Clear();

            yield return line;
        }
        else
            sb.Append((char)symbol);
    }

    yield return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

你可以像使用它一样

foreach (string line in ReadLines(stream))
{
   //do something
}
Run Code Online (Sandbox Code Playgroud)


Enr*_*ada 5

你不能用ReadLine来做,但你可以这样做:

stream.ReadToEnd().Split(new[] {"\r\n"}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)

  • 如果流数据真的很大怎么办?ReadToEnd 似乎不是一个合理的解决方案。 (2认同)