免责声明:如果这个问题对您没有意义,那么这是正常的。我不擅长解释东西。如果您认为某些事情不明确,请在评论中告诉我,我会编辑问题!遗憾!
我实际上是在编写编译器/解释器。我有这个接口,使用该库的客户端代码可以实现,以便可以自定义语言运行时:
public interface ISplRuntime {
object Current {
get;
set;
}
object[] Memory {
get;
}
TextReader Input {
get;
}
TextWriter Output {
get;
}
bool Stopped {
get;
set;
}
void ShowErrorMessage (string error);
}
正如您在此处所见,我可以创建一个控制台应用程序或winforms应用程序。对于控制台应用,我会像这样实现Input
和Output
:
public TextReader Input {
get {return Console.In;}
}
public TextReader Output {
get {return Console.Out;}
}
我在界面中有这些IO属性是因为我的语言(SPL)需要IO指令来读取输入和输出内容。因此,上面的实现基本上意味着语言的IO链接到控制台。当SPL程序输出某些内容时,控制台中会显示某些内容。我希望你能理解。
然而,我担心Input
。因为这是我阅读输入的方式:
/// <summary>
/// Reads a character from the runtime input.
/// </summary>
/// <param name="runtime">The provided runtime for providing input</param>
/// <param name="c">The character read</param>
/// <returns>True if the method successfully reads a character, false otherwise</returns>
private bool ReadFromInput (ISplRuntime runtime, out char c) {
char stuffRead = (char)runtime.Input.Peek ();
if (char.IsLetter (stuffRead)) {
c = (char)runtime.Input.Read ();
return true;
} else {
c = '\0';
return false;
}
}
如果上面的方法返回false
,我还有另一段代码检查它是否已到达文本的末尾。因为读者可能没有达到目的。它可能已经读过一封不是字母的字符。
然后我想到如果我打电话
将会发生什么Console.In.Peek();
事实证明控制台提示我输入。所以我认为,如果runtime.Input == Console.In
,它将永远问我输入。它永远不会到达&#34;结束&#34;。
这是真的吗?如果是,请告诉我如何检测它的结束。我只想要一行输入,如果读者读完所有内容,它就会结束。我怎么能这样做?
如果没有,什么时候结束?
答案 0 :(得分:0)
当您在控制台中输入内容时,您的计算机如何知道何时完成?当你“停止输入”时肯定不会,因为你如何定义“停止”?
您可以像对待任何其他文字阅读器一样对待Console.In
,并检查Peek
。你必须记住的两件关键事项是:
输入只会在用户点击Enter时到达您的代码。它不会在char-by-char的基础上发生,它发生在行级别。这很方便,因为它允许您键入内容,退格一点,正确,然后按Enter键。
您必须在输入结束时专门告诉计算机。这几乎总是通过按Ctrl + Z生成“文件结束”字符来完成。在此之后您仍然需要按Enter键才能将其提交给您的代码。
编辑只是注意到Peek并不适用于控制台输入。但是,如果您尝试从TextReader中读取并检查是否成功,它确实有效。对于您拥有的代码,无论如何,这是更好的方法。
鉴于Read()
会告诉您何时到达文件的末尾,您应该做的是:
Attempt to read character
If successful, and character is a letter
process the character
Else
it's the end of the file
End If