Console.Clear可以用来清除一行而不是整个控制台吗?

时间:2012-01-20 19:26:47

标签: c#

在为学校制定问题/答案计划时,我发现我可以使用Console.Clear()消除屏幕上的所有内容。我想知道我是否可以使用Console.Readline(valueOne),然后只输出答案而没有问题。如果我只问了一个问题,Console.Clear就可以了。

我有几个问题,值不是参考,如果可能,擦除。我想省略问题,只显示几个答案。我想如果我存储答案,我可以使用Console.Clear()然后使用Console.WriteLine()三个变量。我可以这样做:

Console.WriteLine("Value 1 is: {0:c}" + "Value 2 is: {1:c}" + "Value 3 is: {2:c}, valueOne, valueTwo, valueThree).

引用问题更容易,因为存储和检索了值。如果我只是使用方法来传递值并输出值,main()将不会引用这些值来清除并再次输出。这就是为什么我想知道我是否可以问一个问题,然后删除该行并仅输出答案(或答案)。

我只是想了解可能性而不是尝试设置程序。我想知道从引用和值输出值的能力,而没有额外的输出问题。

9 个答案:

答案 0 :(得分:113)

描述

您可以使用Console.SetCursorPosition功能转到特定的行号。 您可以使用此功能清除该行

public static void ClearCurrentConsoleLine()
{
    int currentLineCursor = Console.CursorTop;
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, currentLineCursor);
}

示例

Console.WriteLine("Test");
Console.SetCursorPosition(0, Console.CursorTop - 1);
ClearCurrentConsoleLine();

更多信息

答案 1 :(得分:34)

更简单,更好的解决方案是:

Console.Write("\r" + new string(' ', Console.WindowWidth) + "\r");

它使用carriage return转到行的开头,然后打印出与控制台宽度一样多的空格并再次返回到行的开头,这样您就可以打印自己的测试了。 / p>

答案 2 :(得分:8)

这对我有用:

static void ClearLine(){
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

答案 3 :(得分:7)

" ClearCurrentConsoleLine"," ClearLine"并且上面其余的函数应该使用Console.BufferWidth而不是Console.WindowWidth(你可以看到为什么当你试图使窗口变小时)。控制台的窗口大小当前取决于其缓冲区,并且不能比它宽。 示例(感谢Dan Cornilescu):

public static void ClearLastLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.BufferWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

答案 4 :(得分:4)

我首选的方法是使用PadRight。而不是先清除该行,这将在显示新文本后清除该行的其余部分,从而节省了一个步骤:

Console.CursorTop = 0;
Console.CursorLeft = 0;
Console.Write("Whatever...".PadRight(Console.BufferWidth));

答案 5 :(得分:1)

我们可以简单地编写以下方法

public static void ClearLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

然后在需要时调用它

Console.WriteLine("Test");
ClearLine();

它适用于我。

答案 6 :(得分:1)

要从当前位置清除到当前行的末尾,请执行以下操作:

    public static void ClearToEndOfCurrentLine()
    {
        int currentLeft = Console.CursorLeft;
        int currentTop = Console.CursorTop;
        Console.Write(new String(' ', Console.WindowWidth - currentLeft));
        Console.SetCursorPosition(currentLeft, currentTop);
    }

答案 7 :(得分:0)

public static void ClearLine(int lines = 1)
{
    for (int i = 1; i <= lines; i++)
    {
        Console.SetCursorPosition(0, Console.CursorTop - 1);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, Console.CursorTop - 1);
    }
}

答案 8 :(得分:0)

我想我发现为什么这个问题有不同的答案。当窗口已调整大小以使其具有水平滚动条(因为缓冲区大于窗口)时,Console.CursorTop似乎返回错误的行。无论窗口大小或光标位置如何,以下代码都适用于我。

char *ptr;
ptr=strdup("This is a pointer");
cout<<ptr<<endl;

如果没有(Console.WindowWidth&gt; = Console.BufferWidth?1:0),代码可以向上或向下移动光标,具体取决于您在此页面中使用的版本以及窗口的状态。 / p>