我正在努力验证必须满足特定文件格式的客户的一些文件。每行都有多个固定长度字段,并以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?
答案 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处的字符是CR
或LF
,则会将位置设置为一个字符回(考虑到前一个“行”是512个字符,而不是513个字符)。,然后继续阅读下一个513个字符。
如果以上测试均未通过(即,位置511上的字符既不是CR
也不是LF
),它将退出循环。 您可以根据自己的要求进行调整。
如果您想以字符串形式访问当前行,则可以使用类似以下方法轻松实现:
string line = new string(buffer, 0, 511);