【问题标题】:C# Unhandled Exception: Cannot Read from a Closed TextreaderC# 未处理的异常:无法从关闭的文本阅读器中读取
【发布时间】:2016-12-01 10:40:49
【问题描述】:

所以我试图让我的程序从文本文件中读取并在命令提示符内显示该文本文件上的内容,就像这样......

但是随后程序只能读取文件的一行,然后抛出这个错误异常

我尝试过查看他们抱怨的三个 .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 行 --->
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
}

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

程序.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#,我对此很陌生。感谢您的大力帮助。

【问题讨论】:

    标签: c# exception compiler-errors unhandled


    【解决方案1】:

    您在 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
    
     }
    

    【讨论】:

    • 是的!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2018-05-18
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多