【问题标题】:Does Console.In has an endConsole.In 有没有结束
【发布时间】:2015-11-16 12:24:21
【问题描述】:

免责声明:如果这个问题对您没有意义,那是正常的。我不擅长解释东西。如果您认为您有不清楚的地方,请在 cmets 中告诉我,我将编辑问题!对不起!

我实际上正在自己编写一个编译器/解释器。我有这个接口,使用该库的客户端代码可以实现该接口,以便可以自定义语言运行时:

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 应用程序。对于控制台应用程序,我会像这样实现InputOutput

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,它会一直要求我输入,永远。它永远不会到达“终点”。

这是真的吗?如果是,请告诉我如何检测它的结束。我只想要一行输入,如果读者通读所有内容,它就结束了。我该怎么做?

如果没有,什么时候结束?

【问题讨论】:

  • 按 Ctrl+Z 生成“结尾”。

标签: c# input io compiler-construction console


【解决方案1】:

当您在控制台中输入内容时,您的计算机如何知道您何时完成?肯定不是当你“停止打字”的时候,因为你如何定义“停止”?

您可以像对待任何其他文本阅读器一样对待Console.In,并检查Peek 以获取它。您必须记住的两个关键事项是:

  1. 只有当用户按 Enter 时,输入才会到达您的代码。它不会逐个字符地发生,它发生在行级别。这很方便,因为它允许您键入内容、退格一点、正确输入,然后按 Enter。

  2. 您必须在输入结束时专门告诉计算机。这几乎总是通过按 Ctrl+Z 来生成“文件结尾”字符来完成。在此之后您仍然必须按 Enter 键才能将其提交到您的代码中。

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

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2018-12-01
    • 2019-11-08
    相关资源
    最近更新 更多