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

时间:2012-07-01 17:15:33

标签: c# .net

我原本期望以下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()可以工作。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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