2011-09-04 17 views
3

我正在學習C#的一個類和我的任務我需要從控制檯獲得用戶輸入。Flushing System.Console.Read()

在我的節目,我有:

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

後來在節目中我使用

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

從用戶獲取輸入。

當我運行程序時,第二條語句會被跳過。我猜測System.Console.Read()正在流中留下換行符。在C/C++中,有fflush()和cin.ignore()。 C#中的等效函數是什麼?

我知道,它可能更容易,我使用的ReadLine()或ReadKey(),但我只是好奇,如何使用閱讀()與換行符

回答

9

是的,控制檯輸入被操作系統緩衝。 Read()調用不會返回,直到用戶按Enter鍵。知道這一點後,您可以簡單地調用ReadLine()來使用緩衝區。或者首先使用ReadLine()。

或返回一個按鍵的專用方法:()

但是,您不想使用它,如果你指望用輸入重定向使用你的程序Console.ReadKey。這就是爲什麼有多種方法可以實現相同的目標:ReadKey()繞過stdin輸入流,即被重定向的輸入流。它直接與低層控制檯支持功能進行交流。有一種方法可以檢測到這種情況,因此您可以同時支持這兩種方法,請檢查this answer

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()語句才能正常工作。

或者您可以使用 如果(到Console.ReadLine()。ToLower將()。修剪()== 「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 
} 

也有一些是勉強接近沖洗是Console.Clear()的方法,但,這也清除顯示以及緩衝器。

11

這是我的等值fflush:

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