2016-12-01 97 views
0

所以我想有一個文本文件中讀取了一個程序,顯示的是在命令提示符中的文本文件,這樣的...C#未處理的異常:無法從封閉的TextReader閱讀

enter image description here

但隨後程序可以讀取只有一行的文件,然後拋出此錯誤異常 enter image description here

我試着去在的我的三個文件的.cs他們抱怨的線條。我試着調試和編輯我的代碼,但是我做的越多,得到的越糟糕,所以我非常迷茫和困惑,而且我真的不知道現在要修復什麼。

這些是他們抱怨的代碼行,正下方是實際的代碼文件。

FileReader.cs的第42行--->
return streamReader.ReadLine();

FileReader.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace homework2 
{ 
    #region File Reader Class 
    // ___________________// 
    //  FILE READER // 
    //____________________// 
    class FileReader : Reader 
    { 
     private StreamReader streamReader; 

     #region File Reader File Accessing Method 
     // Accessing the file 
     public FileReader(string fileName) 
     { 
      streamReader = System.IO.File.OpenText(fileName); 
      if (streamReader == null) 
       throw new Exception("OpenRead() failed for file " + fileName); 
     } 
     #endregion 

     #region Read Method 
     // Read Method 
     public override string Read() 
     { 
      // get and return a single line of text 
      return streamReader.ReadLine(); 
     } 
     #endregion 

     #region Close Method 
     // Close Method 
     public override void Close() 
     { 
      streamReader.Close(); 
     } 
     #endregion 
    } 
    #endregion 
} 

MorgReader.cs --->
而48號線((方框= Wrapped.Read())== NULL)

MorgReader的.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using homework2; 

namespace homework2 
{ 
    #region Morg Reader Class 
    //___________________// 
    // MORG READER // 
    //___________________// 
    class MorgReader : ReaderDecorator 
    { 
     MorgFactory Fact; 

     public MorgReader(MorgFactory fact, Reader wrapped) : base(wrapped) 
     { 
      Fact = fact; 
     } 

     public override string Read() 
     { 
      return Wrapped.Read(); 
     } 

     public override void Close() 
     { 
      Wrapped.Close(); 
     } 

     public Morg ReadMorg() 
     { 
      #region splitting the text string 
      // A way to organize the block of text 
      string Box = " "; 
      while ((Box = Wrapped.Read()) == null) 
       return null; 
      string[] Part = Box.Split(','); 
      #endregion 


      #region Displaying each line of text from Morg Reader File to Morg factory 
      // Translate the info from Morg file to Morg factory to the program 
      Morg FactMorg = Fact.CreateMorg(); 
      FactMorg.setName(Part[0]); 

      #region Converting location string to its variable 
      // A way to convert the string location to the current variable for location 
      Location FactLoc; 
      FactLoc = new Location(); 
      FactLoc.X = Convert.ToInt32(Part[1]); 
      FactLoc.Y = Convert.ToInt32(Part[2]); 
      #endregion 

      /* FactMorg.Move(FactLoc.X, FactLoc.Y); */ 
      FactMorg.setLocation(FactLoc); 
      FactMorg.setMovement(Part[3]); 
      FactMorg.setFeeding(Part[4]); 

      #endregion 

      return FactMorg; 
     } 
    } 
    #endregion 
} 

的Program.cs ---的第33行>
而(!(NewMorg = MyReader.ReadMorg())= NULL)

的Program.cs:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace homework2 
{ 
    #region Main Program 
    class Program 
    { 
     static void Main(string[] args) 
     // ____________________ // 
     //  MAIN PROGRAM  // 
     //______________________// 
     { 

      MorgReader MyReader = (new MorgReader(new MyMorgFactory(),new FileReader("morgs.txt"))); 

      Morg NewMorg = new Morg(""); 

      while ((NewMorg = MyReader.ReadMorg()) != null) 
      { 

       string NewMorgName = NewMorg.getName(); 
       Location NewMorgXY = NewMorg.getLocation(); 
       string NewMorgMovement = NewMorg.getMovement(); 
       string NewMorgFeeding = NewMorg.getFeeding(); 

       Console.WriteLine(NewMorgName + " " + NewMorgXY.X + " " + NewMorgXY.Y + " " + NewMorgMovement + " " + NewMorgFeeding); 

       MyReader.Close(); 

      } 

      //MorgTypeA Morg1 = new MorgTypeA("Axel, the Axe-shaped Morg"); 
      //MorgTypeB Morg2 = new MorgTypeB("Bael, the Dark Morg"); 
      //MorgTypeC Morg3 = new MorgTypeC("Corona, the Light Morg"); 

      //Simulator morgGame = new Simulator(Morg1, Morg2, Morg3); 

      //morgGame.run(); 
     } 
    } 
    #endregion 
} 

這是我第一次做C#和我很新的這一點。我感謝你的大力幫助。

回答

2

您在while循環的第一次迭代中關閉了讀者。

public static void Main(string[] args)  
{ 
    //some stuff 

    while ((NewMorg = MyReader.ReadMorg()) != null) 
    { 

     string NewMorgName = NewMorg.getName(); 
     Location NewMorgXY = NewMorg.getLocation(); 
     string NewMorgMovement = NewMorg.getMovement(); 
     string NewMorgFeeding = NewMorg.getFeeding(); 

     Console.WriteLine(NewMorgName + " " + NewMorgXY.X + " " + NewMorgXY.Y + " " + NewMorgMovement + " " + NewMorgFeeding); 

     //MyReader.Close(); -> this line put it out from the while loop 

    } 

    //put it here 
    MyReader.Close(); 

    //other stuff 

} 
+1

是的!非常感謝! – miiworld2