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.In 一次读取超过 1 行的输入?

更新:如下回答:问题是 Peek() 不能依赖。虽然使用 Read() 有效。

4

2 回答 2

3

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

int c;
while((c = Console.In.Read()) != -1)
Console.Out.Write((char)c);
于 2012-07-01T17:23:23.563 回答
1

点击 Ctrl-Z 将产生值 26Console.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

于 2012-07-01T17:45:47.520 回答