代码之家  ›  专栏  ›  技术社区  ›  Developer

当我试图打开一个文件时,为什么我的文件中缺少空白

  •  1
  • Developer  · 技术社区  · 14 年前

    我编写了一个小代码来打开文件我的文件内容如下每行长度是94个字符,行结束符是和


    900000000001000000000000000000000000000000000000000000000000000000

    //同样适用于此文本


    52001 1 1 CCD1 101019101019 111100002000001 82000000010011100002000000000000000111100002000001

         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 回复  |  直到 14 年前
        1
  •  2
  •   Fredrik Mörk    14 年前

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

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


    非LINQ版本 线条校正长度 :

    private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
    {
        foreach (string item in lines)
        {
            if (item.Length != expectedLineLength)
            {
                return false;
            }
        }
        return true;
    }
    
        2
  •  1
  •   user180326 user180326    14 年前

    File.ReadAllLines 以后还要担心线的长度。

        3
  •  0
  •   Klaus Byskov Pedersen    14 年前

    str.Length % 94 != 0 因为 ReadToEnd mod 94 不是在做这项工作。另一种方法是阅读每一行 ReadLine )检查一下长度。 阅读线 删除换行符。

        4
  •  0
  •   Developer    14 年前

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