添加StreamReader实例时出错

时间:2013-06-22 13:51:51

标签: c# text-files streamreader

 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();

                }

            }

        }

这是我的代码,用于在单击菜单条项目时运行。但不知何故,这会让我的应用程序陷入困境。代码中的错误是什么?

2 个答案:

答案 0 :(得分:2)

你附加到txt所以它永远不能为空尝试

   string line;
   while ((line = sr.ReadLine()) != null)
   {
      txt += line + "\n";
      if (txt != null) richTextBox1.Text += txt;
      else sr.Dispose(); // Remove after seeing below
   }

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

using(StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName)))
{
//While loop here
}

答案 1 :(得分:0)

代码中的即时错误是在循环条件中:

  while (txt != null)

由于txt不为null,因此您的应用程序会陷入无限循环。 还有其他一些问题:

  1. 您应该始终处置IDisposable(代码中的StreamReader)
  2. 不要添加到字符串,请使用StringBuilder
  3. 因此,如果您想逐行读取文件到RichEdit,您可以这样做 像那样

      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();
      }