我逐行(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
?
答案 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)
获取文件的字节数。