我正在努力验证来自必须满足特定文件格式的客户的一些文件。每行有多个固定长度的字段,以 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?
正如其他人在评论中所说,您不能使用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);