Console.In有没有尽头
Does Console.In has an end
免责声明:如果这个问题对您来说没有意义,那很正常。我不擅长解释东西。如果您认为有什么不清楚,请在评论中告诉我,我会编辑问题!对不起!
我实际上正在写 compiler/interpreter 东西。我有这个接口,使用该库的客户端代码可以实现该接口,以便可以自定义语言运行时:
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 = '[=13=]';
return false;
}
}
而且我还有另外一段代码检查如果上面的方法returnsfalse
是否已经到了文末。因为 reader 可能还没有走到尽头。它可能读取了一个不是字母的字符。
然后我想如果我调用
会发生什么
Console.In.Peek();
结果是控制台提示我输入。所以我认为如果 runtime.Input == Console.In
,它会一直要求我输入,永远。它永远不会达到 "end".
这是真的吗?如果是,请告诉我如何检测它的结束。我只需要一行输入,如果 reader 读完所有内容,它就结束了。我该怎么做?
如果没有,什么时候结束?
当您在控制台中输入内容时,您的计算机如何知道您已完成输入?你"stop typing"肯定不是,因为你怎么定义"stopped"?
您可以像对待任何其他文本 reader 一样对待 Console.In
,并检查 Peek
。您必须记住的两个关键事项是:
只有当用户按下 Enter 键时,输入才会到达您的代码。它不会逐个字符地发生,它发生在行级别。这很方便,因为它允许您键入内容,退格一点,正确输入,然后按 Enter。
您必须在输入结束时明确告诉计算机。这几乎总是通过按 Ctrl+Z 生成一个 "end of file" 字符来完成的。在此之后您仍然需要按回车键,以便将其提交给您的代码。
edit 刚刚注意到 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
免责声明:如果这个问题对您来说没有意义,那很正常。我不擅长解释东西。如果您认为有什么不清楚,请在评论中告诉我,我会编辑问题!对不起!
我实际上正在写 compiler/interpreter 东西。我有这个接口,使用该库的客户端代码可以实现该接口,以便可以自定义语言运行时:
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 = '[=13=]';
return false;
}
}
而且我还有另外一段代码检查如果上面的方法returnsfalse
是否已经到了文末。因为 reader 可能还没有走到尽头。它可能读取了一个不是字母的字符。
然后我想如果我调用
会发生什么Console.In.Peek();
结果是控制台提示我输入。所以我认为如果 runtime.Input == Console.In
,它会一直要求我输入,永远。它永远不会达到 "end".
这是真的吗?如果是,请告诉我如何检测它的结束。我只需要一行输入,如果 reader 读完所有内容,它就结束了。我该怎么做?
如果没有,什么时候结束?
当您在控制台中输入内容时,您的计算机如何知道您已完成输入?你"stop typing"肯定不是,因为你怎么定义"stopped"?
您可以像对待任何其他文本 reader 一样对待 Console.In
,并检查 Peek
。您必须记住的两个关键事项是:
只有当用户按下 Enter 键时,输入才会到达您的代码。它不会逐个字符地发生,它发生在行级别。这很方便,因为它允许您键入内容,退格一点,正确输入,然后按 Enter。
您必须在输入结束时明确告诉计算机。这几乎总是通过按 Ctrl+Z 生成一个 "end of file" 字符来完成的。在此之后您仍然需要按回车键,以便将其提交给您的代码。
edit 刚刚注意到 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