当我尝试打开文件时,为什么我文件中的空格丢失了

时间:2010-10-19 12:22:25

标签: c# winforms

我写了一个小代码打开文件,我的文件内容如下,每行长度为94个字符,行终止符为\ r和\ n

101 111111111 1111111111010190542A094101
9000000000001000000000000000000000000000000000000000000

//同样适合本文

101 111111111 1111111111010190608A094101
52001 1 1 CCD1 101019101019 1111000020000001 6201110000251 00000000011 1 0111000020000001 820000000100111000020000000000000000000000011 111000020000001 9000001000001000000010011100002000000000001000000000000

     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
             }
           }

但我没有在这里得到错误任何人都可以说明原因

4 个答案:

答案 0 :(得分:2)

包含或排除换行符的是94个字符吗?字符串"a\r\nb"长度为四个字符,而不是两个字符。根据完整文件内容验证行长度似乎有点脆弱。例如,文件可能以\r\n对结束。我更愿意单独阅读这些行并验证每行的修剪长度。

<强>更新
可以通过将内容与预期的行长度匹配来验证内容:

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个字符的字符串:

string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 4); // returns true

看起来不错。但是,请考虑一下:

string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 6); // returns true

返回true,因为我们检查的唯一内容是字符串的总长度(删除换行符后)可以均匀分割为6 - 字符行。使用12个字符的字符串是可能的,但这并不意味着它实际上由6个字符长的行组成。因此,更好的方法是检查线的长度。您可以逐个读取这些行,验证它并将其添加到输出中,如果它没有问题:

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
        }
    }
}

...或者你得到所有行,验证它们的长度,然后在它们验证OK(在这种情况下使用LINQ All扩展方法)时使用它们:

private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    return lines.All(s => s.Length == expectedLineLength);
}

// usage:
string[] lines = File.ReadAllLines("thefile.txt");
if (LinesHaveCorrectLength(lines, 94))
{
    // do something
}

更新2
根据您的评论,这应该适用于您的代码(使用上面示例代码中的LinesHaveCorrectLength方法,只有当所有行都具有预期长度时才会返回true

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    strFilePath = openFileDialog1.FileName;
    string[] lines = File.ReadAllLines(strFilePath);
    if (LinesHaveCorrectLength(lines, 94))
    {
        // add lines to grid
    }
}

更新3
非LINQ版本的LinesHaveCorrectLength

private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    foreach (string item in lines)
    {
        if (item.Length != expectedLineLength)
        {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:1)

我的第一次尝试是File.ReadAllLines并且稍后会担心线路长度。

答案 2 :(得分:0)

您没有收到错误,因为没有任何错误。但是,您需要处理str.Length % 94 != 0的情况,因为ReadToEnd将在字符串中包含换行符,这就是mod 94没有完成工作的原因。另一种方法是读取每一行(ReadLine)并检查长度。 ReadLine会删除换行符。

答案 3 :(得分:0)

这个适用于我

while (sr.Peek() >= 0)
{
  str = sr.ReadLine().Replace("\r", "").Replace("\n", "");
  length += str.Length;
}