Console.In是否有结尾

时间:2015-11-16 12:24:21

标签: c# input io compiler-construction console

免责声明:如果这个问题对您没有意义,那么这是正常的。我不擅长解释东西。如果您认为某些事情不明确,请在评论中告诉我,我会编辑问题!遗憾!

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

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,它将永远问我输入。它永远不会到达&#34;结束&#34;。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

  1. 输入只会在用户点击Enter时到达您的代码。它不会在char-by-char的基础上发生,它发生在行级别。这很方便,因为它允许您键入内容,退格一点,正确,然后按Enter键。

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

  3. 编辑只是注意到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