当没有字符时,如何从stdin中读取
本文关键字:stdin 读取 字符 | 更新日期: 2023-09-27 17:49:32
我正在编写一个类似于Java的基本Scanner
类。以下是我所拥有的(好吧,是相关的部分):
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.Read
和this.Reader.Peek
返回-1
。
我怎么能强迫它请求一个新的字符,同时仍然支持真正的文件和StringReader
实例?
我更改了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;
}