C# 添加StreamReader实例时出错

C# 添加StreamReader实例时出错,c#,text-files,streamreader,C#,Text Files,Streamreader,这是我的代码,打算在单击菜单条“打开”时运行。但不知怎么的,这在我的应用程序上造成了一个障碍。代码中的错误是什么?您正在向txt追加内容,因此它永远不能为空。请尝试 private void openToolStripMenuItem_Click(object sender, EventArgs e) { string txt = ""; OpenFileDialog ofd = new OpenFileDialog();

这是我的代码,打算在单击菜单条“打开”时运行。但不知怎么的,这在我的应用程序上造成了一个障碍。代码中的错误是什么?

您正在向txt追加内容,因此它永远不能为空。请尝试

 private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string txt = "";
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Text File|*.txt";
            ofd.FileName = "File";
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

                StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName));

                while (txt != null) {



                    txt += sr.ReadLine() + "\n";
                    if (txt != null) richTextBox1.Text += txt;
                    else sr.Dispose();

                }

            }

        }
此外,您应该始终处理您的streamreader,以便像这样包装您的while循环(也替换streamreader line)


代码中的直接错误在循环条件中:

using(StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName)))
{
//While loop here
}
因为txt不是空的,所以您的应用程序将阻塞在无限循环中。 还有一些其他问题:

  • 您应该始终处理IDisposable(代码中的StreamReader)
  • 不要添加到字符串,请使用StringBuilder
  • 所以,如果您想将文件逐行读取到RichEdit中,您可以这样做 那样

      while (txt != null)
    

    这是Windows应用程序吗?你有没有试过设置一个断点,看看它会卡在哪里?
      while (txt != null)
    
      OpenFileDialog ofd = new OpenFileDialog();
      ofd.Filter = "Text File|*.txt";
      ofd.FileName = "File";
    
      StringBuilder Sb = new StringBuilder();
    
      if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        using (StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName))) {
          while (!sr.EndOfStream)
            if (Sb.Length > 0) {
              Sb.AppendLine();
              Sb.Append(sr.ReadLine());
            }
            else
              Sb.Append(sr.ReadLine());
        }
    
        richTextBox1.Text += Sb.ToString();
      }