4

我有一个逐行的流阅读器(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();
            ...

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

4

3 回答 3

8

使用 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();
}

你可以像这样使用它

foreach (string line in ReadLines(stream))
{
   //do something
}
于 2014-09-15T07:58:58.950 回答
4

你不能用 ReadLine 做到这一点,但你可以这样做:

stream.ReadToEnd().Split(new[] {"\r\n"}, StringSplitOptions.None)
于 2014-09-15T08:10:25.647 回答
-1

为简化起见,让我们处理一个字节数组:

    static int NumberOfNewLines(byte[] data)
    {
        int count = 0;
        for (int i = 0; i < data.Length - 1; i++)
        {
            if (data[i] == '\r' && data[i + 1] == '\n')
                count++;
        }
        return count;
    }

如果您关心效率,请优化,但这应该可行。

您可以使用System.IO.File.ReadBytes(string filename).

于 2014-09-15T08:10:59.930 回答