StreamReader 在 while 循环中读取 null

StreamReader reads null in while loop

使用这种方法,我循环遍历一个文件,删除其中带有 'T' 的行并将它们存储到列表中。在循环结束时它应该退出,但是它读取 null 值并继续传递它并抛出异常消息...

System.ArgumentNullException: 'Value cannot be null. Parameter name: source'

...在它试图寻找字符的地方。

public static List<string> GetToolsFromFile()
{
    FileStream FS = new FileStream(OpenFile(), FileMode.Open);
    List<string> list = new List<string>();

    using (StreamReader Sr = new StreamReader(FS))
    {
        char c = 'T';

        while (Sr.ReadLine() != null)
        {
            string line = Sr.ReadLine();
            //MessageBox.Show(line.ToString());
            if (line.Contains(c))
            {
                list.Add(line);
                // MessageBox.Show(line.ToString());
            }
        }

        FS.Close();
    }

    return list;
}

OpenFile()是使用OpenFileDialog的方法。这已经过测试并在检索和显示所选文件的内容时正常工作。

您正在调用 ReadLine 方法 两次 次。第一次在 while 循环条件中,第二次在 while 体内。假设您的文件有 3 行,这里是对 ReadLine 方法的调用:

  1. 在循环条件下,它读取第一行。
  2. 在循环体中,它读取第二行并将其赋值给line变量。
  3. 在循环条件下,读取第三行(也就是最后一行)
  4. 在循环体中,它 returns 为 null,因此您的 line 变量被分配给 null 然后您在空字符串上调用 Contains 方法。这就是异常所说的。

请查看更正后的代码

FileStream FS = File.Open(@"c:\path_to_The_File", FileMode.Open);
        List<string> list = new List<string>();

        using (StreamReader Sr = new StreamReader(FS))
        {
            char c = 'T';

            string line = Sr.ReadLine();
            while (line != null)
            {

                //MessageBox.Show(line.ToString());
                if (line.Contains(c))
                {
                    list.Add(line);
                    // MessageBox.Show(line.ToString());
                }

                line = Sr.ReadLine();
            }


            FS.Close();
        }