miiworld2 miiworld2 - 2 days ago 6
C# Question

C# Unhandled Exception: Cannot Read from a Closed Textreader

So I'm trying to have my program read from a text file and display what is on that text file inside the command prompt, like so...

enter image description here

But then the program can read only one line of the file, and then throws this error exception
enter image description here

I've tried going over the lines of my three .cs files they complain about. I tried debugging and editing my code, but the more I do it, the worse it gets, so I'm very lost and confused and I honestly don't know what to fix at this point.

These are the lines of codes they complain about, and right below them are the actual code files.

Line 42 of 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
}


Line 48 of MorgReader.cs --->

while ((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 of Program.cs --->

while ((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
}


This is my first time doing C# and I'm very new to this. I appreciate your grand help.

Answer

You are closing your reader on first iteration of your while loop.

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

 }
Comments