StreamReader читает CRLF - PullRequest
       17

StreamReader читает CRLF

0 голосов
/ 26 сентября 2018

Я работаю над проверкой некоторых файлов от наших клиентов, которые должны соответствовать определенному формату файлов.Каждая строка имеет несколько полей фиксированной длины и заканчивается 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 голосов
/ 26 сентября 2018

Как уже говорили другие в комментариях, вы не можете использовать 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 является либо CR, либо LF, он вернет позицию на один символ назад (учитывая, что предыдущая "строка" была 512 символов, а не 513) и продолжить чтение следующих 513 символов.

  • Если ни один из вышеуказанных тестов не пройден (т. е. символ в позиции 511 не является ни CR, ни LF), он выйдетпетля. Вы можете настроить это в соответствии со своими требованиями .

И если вы хотите получить доступ к текущей строке в виде строки, вы можете легко сделать это, используя что-то вроде:

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