流读线

时间:2014-09-15 07:50:27

标签: 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();
            ...

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

3 个答案:

答案 0 :(得分:6)

使用StreamReader.ReadLine无法执行此操作。 根据{{​​3}}:

  

一条线被定义为一个字符序列,后跟换行符   (“\ n”),回车(“\ r”)或马车回程   后跟换行符(“\ r \ n”)。返回的字符串不会   包含终止回车或换行。归来了   如果到达输入流的末尾,则value为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
}

答案 1 :(得分:5)

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

stream.ReadToEnd().Split(new[] {"\r\n"}, StringSplitOptions.None)

答案 2 :(得分:-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)获取文件的字节数。