2016-12-01 6 views
0

Так что я пытаюсь, чтобы моя программа чтения из текстового файла и показать то, что на этом текстовом файле внутри командной строки, вот так ...C# Необработанное исключение: не могу читать из закрытого TextReader

enter image description here

Но тогда программа может читать только одну строку файла, а затем выдает это исключение ошибки enter image description here

Я судимый идти по линиям трех моих .cs файлов, которые они жалуются. Я пытался отлаживать и редактировать свой код, но чем больше я это делаю, тем хуже он становится, поэтому я очень потерян и смущен, и я честно не знаю, что исправить в этот момент.

Это строки кодов, на которые они жалуются, а прямо под ними - фактические файлы кода.

Линия 42 файла FileReader.cs --->
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 
} 

линии 48 из MorgReader.cs --->
в то время как ((Box = 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 
} 

Line 33 из Program.cs --->
в то время как (! (NewMorg = MyReader.ReadMorg()) = нуль)

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