在C#中读取行而不会丢失换行符

时间:2019-03-21 15:48:52

标签: c# string

此刻,我正在使用C#的内置StreamReader从文件中读取行。

众所周知,如果最后一行为空白,则流读取器不会将其确认为单独的行。也就是说,一行必须包含文本,结尾处的换行符对于最后一行是可选的。

这会对我丢失的某些文件产生影响(重要的,由于我不想进入的重要原因),程序每次使用并重写特定文件时,文件末尾都有空白。

是否有TextReader的实现,可以作为语言的一部分,也可以作为提供ReadLine功能的NuGet包提供,但保留换行符(无论它们是哪个)作为该行的一部分,以便我可以准确地重现输出?我希望不必滚动自己的方法来使用基于行的输入。

编辑:应该注意,我无法将整个文件读入内存。

2 个答案:

答案 0 :(得分:4)

您可以将ReadToEnd()Split结合使用以获取文件内容的数组,包括空行。

如果文件很大,我不建议您使用ReadToEnd()

例如:

string[] lines;

using (StreamReader sr = new StreamReader(path)) 
{
    var WholeFile = sr.ReadToEnd();
    lines = WholeFile.Split('\n');
}

答案 1 :(得分:1)

private readonly char newLineMarker = Environment.NewLine.Last();
private readonly char[] newLine = Environment.NewLine.ToCharArray();
private readonly char eof = '\uffff';

private IEnumerable<string> EnumerateLines(string path)
{
    using (var sr = new StreamReader(path))
    {
        char c;
        string line;
        var sb = new StringBuilder();

        while ((c = (char)sr.Read()) != eof)
        {
            sb.Append(c);
            if (c == newLineMarker &&
                (line = sb.ToString()).EndsWith(Environment.NewLine))
            {
                yield return line.Trim(newLine);

                sb.Clear();
                sb.Append(Environment.NewLine);
            }
        }

        if (sb.Length > 0)
            yield return sb.ToString().Trim(newLine);
    }
}