StreamReader读取CRLF

时间:2018-09-25 21:26:53

标签: c# streamreader readline

我正在努力验证必须满足特定文件格式的客户的一些文件。每行都有多个固定长度字段,并以511个字符结尾,字符512和513为CR和LF。

我已经能够使用子字符串来轻松地获取每个字段,但是StreamReader / ReadLine在定位第512个和第513个字符时遇到了问题。尝试使用子字符串查找那些字符时,出现“ System.ArgumentOutofRangeException”错误。

StreamReader file = new StreamReader(textBox2.Text);
while ((line = file.ReadLine()) != null)
{
    int lineLength = line.Length;
    string crlf = "";
    /*
    if (lineLength == 511)
    {
        crlf = line.Substring(511, 2);
    }
    */
 }

我已注释掉导致错误的部分。我有什么选择来确认每行的末尾是CRLF?

1 个答案:

答案 0 :(得分:0)

就像其他人在评论中说的那样,您不能使用ReadLine()并期望在返回的字符串中找到EOL字符。现在,如果我对您的理解正确,那么您可以使用StreamReader做类似的事情:

using (var sr = new StreamReader(filePath))
{
    long position = 0;
    char[] buffer;
    while (sr.Peek() >= 0)
    {
        buffer = new char[513];
        sr.Read(buffer, 0, buffer.Length);
        if (buffer[511] == '\r' && buffer[512] == '\n')
        {
            position += 513;
            Console.WriteLine("CRLF");
        }
        else if (buffer[511] == '\r' || buffer[511] == '\n')
        {
            position += 512;
            sr.BaseStream.Seek(position, SeekOrigin.Begin);
            sr.DiscardBufferedData();
            Console.WriteLine("CR or LF");
        }
        else
        {
            Console.WriteLine("Something went wrong!");
            break;
        }
    }
}

这将一次读取513个字符的块并检查以下内容:

  • 如果最后两个字符是CRLF,那么我们很好,它将继续读取接下来的513个字符。

  • 如果上述测试未通过,但是位置511处的字符是CRLF,则会将位置设置为一个字符回(考虑到前一个“行”是512个字符,而不是513个字符)。,然后继续阅读下一个513个字符。

  • 如果以上测试均未通过(即,位置511上的字符既不是CR也不是LF),它将退出循环。 您可以根据自己的要求进行调整

如果您想以字符串形式访问当前行,则可以使用类似以下方法轻松实现:

string line = new string(buffer, 0, 511);