Flushing System.Console.Read()

时间:2011-09-04 22:32:18

标签: c#

我正在为我的一个课程学习C#而我的作业需要从控制台获得用户输入。

在我的课程中,我有:

choice = (char)System.Console.Read();

稍后在程序中我使用

if (System.Console.ReadLine() == "y")

从用户那里获得输入。

运行程序时会跳过第二个语句。我猜测System.Console.Read()在流中留下换行符。在C / C ++中,有fflush()和cin.ignore()。 C#中的等效函数是什么?

我知道使用ReadLine()或ReadKey()可能更容易,但我只是好奇如何将Read()与换行符一起使用

3 个答案:

答案 0 :(得分:14)

这相当于fflush:

while (Console.KeyAvailable)
    Console.ReadKey(true);

答案 1 :(得分:10)

是的,控制台输入由操作系统缓冲。在用户按Enter键之前,不会返回Read()调用。知道了这一点,之后你可以简单地调用ReadLine()来使用缓冲区。或者首先使用ReadLine()。

或返回单击键的专用方法:Console.ReadKey()

但是,如果您希望程序与输入重定向一起使用,则不希望使用它。这就是为什么有多种方法可以实现相同的目标:ReadKey()绕过stdin输入流,即重定向的输入流。它直接与低级控制台支持功能对话。有一种方法可以检测到这一点,因此您可以支持两者,请检查this answer

答案 2 :(得分:1)

class Program
{

    static void Main(string[] args)
    {
        if (Console.ReadLine() == "y")
            Console.WriteLine("You typed y");

        Console.ReadLine();

    }
}

您也可以

if (Console.ReadLine().ToLower() == "y")
            Console.WriteLine("You typed y");

如果你正在做char c =(char)Console.Read();然后无论你为Console.Read键入什么..你必须继续输入它旁边的Console.Readline()语句,以使Console.Readline工作。

或者你也可以使用     if(Console.ReadLine()。ToLower()。Trim()==“y”)

但为此,您可以为Console.Read()

键入内容

就像输入值N一样,然后你必须在一些空格之后键入y,以便下一个Console.ReadLine进行评估。

喜欢这个。

    n                y

class Program
{

    static void Main(string[] args)
    {
        char c = (char)Console.Read();
         if (Console.ReadLine().ToLower().Trim() == "y")
            Console.WriteLine("You typed y");

        Console.ReadLine();

    }

    //input: n   y
    //output: You typed y
}

有一些几乎不接近flush的东西是Console.Clear()方法,但这也清除了显示和缓冲区。