Console.In.Peek()在输入时返回-1

我本以期望以下C#程序只打印“EOF!” 一旦我在控制台中点击“Ctrl-Z”。 相反,只要我按Enter键,程序就会完成:

var textReader = Console.In; var sb = new StringBuilder(); while(textReader.Peek() != -1) { sb.Append((char)textReader.Read()); } Console.WriteLine("Entered: '{0}'", sb); Console.WriteLine("EOF!"); 

例:

 12345 <= I entered this Entered: '12345 <= program outputs this ' EOF! Press any key to continue . . . 

任何人都可以解释上述行为吗? 这根本不是我的预期。

如何从Console中读取多行输入。一次只能输入一个字符?

更新:如下所述:问题是不能依赖Peek()。 但是使用Read()可以正常工作。

Console.In.Read()在EOF上返回-1,所以你可以这样做:

 int c; while((c = Console.In.Read()) != -1) Console.Out.Write((char)c); 

按Ctrl-Z将从Console.In.Peek();生成值26 Console.In.Peek(); 您必须关闭输入流才能生成-1(当您关闭控制台时,按Ctrl-C(默认情况下),或显式调用Console.In.Close() )。

此外,默认情况下,控制台流将以线路模式运行,这意味着在您按Enter键之前,实际上不会使用字符填充流。 您可以使用“Console.ReadKey”来阻止(请参阅http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.key.aspx ),也可以将控制台切换为线路模式。 AC#的例子可以在这里找到: http : //ewbi.blogs.com/develops/2005/11/net_console_pre.html 。