我想覆盖控制台中的最后一行,以便使用更改来循环特定行。
例如: 我想打印到控制台 。然后..然后......
这是我的代码:
int dot = 1;
while (true)
{
switch (dot)
{
case 1:
Console.SetCursorPosition(0, Console.CursorTop-1);
Console.WriteLine(".");
dot++;
Thread.Sleep(500);
break;
case 2:
Console.SetCursorPosition(0, Console.CursorTop -1);
Console.WriteLine("..");
dot++;
Thread.Sleep(500);
break;
case 3:
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.WriteLine("...");
dot = 1;
Thread.Sleep(500);
break;
}
}
}
我的问题是,在第一轮完成后(在第一次打印“...”之后),它不会打印“。”控制台留在“......”
我的意思是:
现在它保持“...”而是删除“...”并打印“。”。
有人知道为什么?
答案 0 :(得分:9)
您只打印一个字符时打印一个字符 - 您不会影响该行的其余部分。
如果你改变了这个:
Console.WriteLine(".");
到
Console.WriteLine(". ");
然后它将删除前一次迭代所写的任何字符。 (但仍然不会清除该行上的任何其他内容。)
(您可能希望将Console.WriteLine("..")
更改为Console.WriteLine(".. ")
以保持一致性,但它不会产生任何影响,因为您已经在上一次迭代中打印了最后一个空格。)
请注意,您也可以相当简单地删除重复:
string[] dots = { ". ", "..", "..." };
int index = 0;
while (true)
{
Console.SetCursorPosition(0, Console.CursorTop -1);
Console.WriteLine(dots[index]);
index = (index + 1) % 3;
Thread.Sleep(500);
}
答案 1 :(得分:0)
在写入控制台时,您可以替换字符,但在首次运行时无需替换,因此您可以看到更改。在第二个循环中,您将第一个点替换为新点,并且不会在屏幕上产生更改。修复它的最简单方法是在第一个字符串后面添加空格,这样就是3个字符长:
". "
答案 2 :(得分:0)
您希望在上次迭代后替换...
,因为您可以这样做,您可以使用PadRight函数。 PadRight是一个很好的方法,因为你可以在其中配置数字值。
var str = ".";
var padded = str.PadRight(2);
// padded = ". "
所以你的代码会变成这样的
switch (dot)
{
case 1:
Console.SetCursorPosition(0, Console.CursorTop-1);
var str = ".";
var padded = str.PadRight(2);
Console.WriteLine(str);
dot++;
Thread.Sleep(500);
break;
case 2:
Console.SetCursorPosition(0, Console.CursorTop -1);
Console.WriteLine("..");
dot++;
Thread.Sleep(500);
break;
case 3:
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.WriteLine("...");
dot = 1;
Thread.Sleep(500);
break;
}
答案 3 :(得分:-1)
Console.WriteLine
会自动在末尾附加换行符(\n
),这会导致光标跳转到下一行。
您必须使用Console.Write
。它不会附加换行符。但是你必须在文本末尾添加\r
才能将光标移回到起始位置。
所以,您的打印声明看起来像
Console.Write(". \r");
Console.Write(".. \r");
Console.Write("...\r");