此刻,我正在使用C#的内置StreamReader
从文件中读取行。
众所周知,如果最后一行为空白,则流读取器不会将其确认为单独的行。也就是说,一行必须包含文本,结尾处的换行符对于最后一行是可选的。
这会对我丢失的某些文件产生影响(重要的,由于我不想进入的重要原因),程序每次使用并重写特定文件时,文件末尾都有空白。
是否有TextReader
的实现,可以作为语言的一部分,也可以作为提供ReadLine
功能的NuGet包提供,但保留换行符(无论它们是哪个)作为该行的一部分,以便我可以准确地重现输出?我希望不必滚动自己的方法来使用基于行的输入。
编辑:应该注意,我无法将整个文件读入内存。
答案 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);
}
}