C# 当我试图打开文件时,为什么文件中的空白区域丢失
我编写了一个小代码来打开文件。我的文件内容如下:每行长度为94个字符,行终止符为\r和\nC# 当我试图打开文件时,为什么文件中的空白区域丢失,c#,winforms,C#,Winforms,我编写了一个小代码来打开文件。我的文件内容如下:每行长度为94个字符,行终止符为\r和\n private void mnuOpen_Click(object sender, EventArgs e) { string strFilePath = string.Empty; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.FileName
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
101111111111010190542A094101900000000001000000000000000000000000000000000000000000000000000000000000
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
//这篇文章也是如此
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
101 111111111111010190608A09410152001 1 CCD1 101019101019 111100002000001 6201110000251 00000000011 1 1 0111000020000001 820000000100111000020000000000000000000000011 111000020000001 90000001000000010011100020000000000001000000000000000000
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
但是我没有在这里遇到错误。谁能告诉我为什么我的第一次尝试是
File.ReadAllLines
,并担心以后的行长度 您没有收到错误,因为没有任何问题。但是,您需要处理str.Length%94!=0
因为ReadToEnd
将在字符串中包含换行符,这就是为什么mod 94
不起作用的原因。另一种方法是读取每一行(使用ReadLine
)并检查长度ReadLine
会删除换行符。这94个字符包括或不包括换行符吗?字符串“a\r\nb”
的长度为四个字符,而不是两个。基于完整文件内容验证行长度似乎有点脆弱。例如,文件是否以\r\n
对结尾。我更愿意单独阅读这些行,并验证每行的修剪长度
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
更新您可以通过将内容与预期的行长度进行匹配来验证内容:
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
public static bool StringIsValid(string input, int expectedLineLength)
{
return input.Replace("\r\n", "").Length % expectedLineLength == 0;
}
// called like so:
if (StringIsValid(str, 94))
{
// do something
}
但这并不十分准确。假设我们需要4个字符的字符串:
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 4); // returns true
看起来不错。但是,考虑一下:
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 6); // returns true
这也返回true,因为我们检查的唯一一件事是字符串的总长度(在删除换行符后)可以均匀地拆分为6个字符的行。可以使用12个字符的字符串,但这并不意味着它实际上由6个字符长的行组成。因此,更好的方法是检查线的长度。您可以一行一行地读取数据,验证数据并将其添加到输出中(如果正常):
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
private static bool LineHasCorrectLength(string line, int expectedLineLength)
{
return line.Length == expectedLineLength;
}
// usage:
using (StreamReader reader = File.OpenText("thefile.txt"))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (LineHasCorrectLength(line, 94))
{
// add to output
}
}
}
…或者获取所有行,验证它们的长度,然后在它们验证正常时使用它们(在这种情况下,使用LINQall
extension方法):
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
更新2根据您的评论,这应该适用于您的代码(使用上述示例代码中的
LinesHaveCorrectLength
方法,仅当所有行都具有预期长度时,该方法才会返回true
):
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
更新3非LINQ版本的
LinesHaveCorrectLength
:
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
foreach (string item in lines)
{
if (item.Length != expectedLineLength)
{
return false;
}
}
return true;
}
这个适合我
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
while (sr.Peek() >= 0)
{
str = sr.ReadLine().Replace("\r", "").Replace("\n", "");
length += str.Length;
}
您希望得到什么错误?顺便说一下,使用
File.ReadAllText
或File.ReadAllLines
似乎是一个很好的例子。实际上,如果条件满足,我应该在网格中显示内容。这个条件对我的文件来说是真的,因为长度是188,但是当我调试1之后第一行的最后一个字符时,空白字符丢失了。如果我使用ReadLine,我只能读取一行,但是另一行呢,那么每行的长度将是96个字符,假设最后一行也以换行符结尾。@Dorababu:修改后,字符串将不再包含任何换行符,因此您需要借助字符串分析来填充网格。我仍然会选择逐行读取文件。但是如果我的文件中有两行以上的代码,那么它就可以工作。为什么会发生这种情况?如果代码不适用于我的所有情况,那么我可以更改它,但在少数情况下它可以工作,正如我所提到的,我是通过声明一个布尔变量得到它的