0

私はScannerJavaに似た基本的なクラスを書いています。これが私が持っているものです(まあ、関連する部分):

using System.Text;
using System.Collections.Generic;

namespace System.IO
{
    /// <summary>
    ///     <remarks>
    ///         Scanner is a wrapper for a <see cref="System.IO.TextReader" />
    ///         instance, making it easier to read values of certain types. It
    ///         also takes advantage of the
    ///         <see cref="System.IO.EndOfStreamException" /> class.
    ///     </remarks>
    ///     <seealso cref="System.IO.TextReader" />
    /// </summary>
    public class Scanner
    {
        private TextReader Reader;
        private Queue<char> CharacterBuffer = new Queue<char>();

        /// <summary>
        ///     <remarks>
        ///         Defaults to reading from <see cref="Console.In"/>
        ///     </remarks>
        /// </summary>
        public Scanner() : this(Console.In)
        {
        }

        public Scanner(TextReader reader)
        {
            this.Reader = reader;
        }

        public char Peek()
        {
            if (this.CharacterBuffer.Count > 0)
                return this.CharacterBuffer.Peek();

            try
            {
                return Convert.ToChar(this.Reader.Peek());
            }
            catch (OverflowException)
            {
                throw new EndOfStreamException();
            }
        }

        public char ReadChar()
        {
            if (this.CharacterBuffer.Count > 0)
                return this.CharacterBuffer.Dequeue();

            try
            {
                return Convert.ToChar(this.Reader.Read());
            }
            catch (OverflowException)
            {
                throw new EndOfStreamException();
            }
        }
    }
}

私が実行したいくつかのテストから、これは実際のファイルではうまく機能しますが、stdinでは期待どおりに機能しません。Scanner.Peekまたはを使用するScanner.ReadCharと、改行が送信された後、TextReaderインスタンスはそれがファイルの最後にあると見なし(私は思う)、EndOfStreamExceptionそれ以降にインスタンスをスローして、this.Reader.Readthis.Reader.Peek返します-1

StringReader真のファイルとインスタンスをサポートしながら、新しい文字を要求するように強制するにはどうすればよいですか?

4

1 に答える 1

0

Peek次のコードを反映するように変更しました。ここに直接メモリから入力したので、これが100%かどうかはわかりません。

public char Peek()
{
    if (this.CharacterBuffer.Count > 0)
        return this.CharacterBuffer.Peek();

    char Character
    try
    {
        Character = Convert.ToChar(this.Reader.Read());
    }
    catch (OverflowException)
    {
        throw new EndOfStreamException();
    }

    this.CharacterBuffer.Enqueue(Character);
    return Character;
}
于 2013-01-20T16:43:05.870 に答える