控制台中的最后一行不会覆盖

时间:2017-12-04 07:20:12

标签: c#

我想覆盖控制台中的最后一行,以便使用更改来循环特定行。

例如: 我想打印到控制台 。然后..然后......

这是我的代码:

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;
        }
    }
}

我的问题是,在第一轮完成后(在第一次打印“...”之后),它不会打印“。”控制台留在“......”

我的意思是:

  • “”。打印
  • 删除“。”并打印“..”
  • 删除“..”并打印“...”

现在它保持“...”而是删除“...”并打印“。”。

有人知道为什么?

4 个答案:

答案 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");