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

Posted

技术标签:

【中文标题】Console.Clear 可以用来只清除一行而不是整个控制台吗?【英文标题】:Can Console.Clear be used to only clear a line instead of whole console? 【发布时间】:2012-01-20 19:26:47 【问题描述】:

在为学校编写问答程序时,我突然想到我可以使用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() 将没有对这些值的引用以再次清除和输出。这就是为什么我想知道我是否可以只问一个问题,然后删除该行并只输出一个(或多个)答案。

我只是想了解可能性,而不是尝试设置程序。我想知道在没有额外输出问题的情况下从参考和按值输出值的能力。

【问题讨论】:

顺便说一句,我只是 c# 的 3 周学生。 你想做什么?我很难理解您对“答案”和“问题”的使用 - 它们是什么以及您正在构建什么?你的问题是什么? 【参考方案1】:

说明

您可以使用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();

更多信息

Console.SetCursorPosition Method

【讨论】:

这段代码应该使用Console.BufferWidth而不是Console.WindowWidth,因为可能会有字符写在可见窗口区域之外。 为什么使用(Console.CursorTop - 1) 不会导致超出范围错误?我正在查看SetCursorPosition 的C# 源代码,看起来它使用'int' 会使数字变为-1。我看到它没有使用无符号整数,那为什么不抛出错误呢? @TheFluffyRobot 因为Console.CursorTop 返回当前行,所以Console.CursorTop - 1 返回上一行。由于前面有Console.WriteLine("Test");,所以当前行永远不会是0。【参考方案2】:

一个更简单且更好的解决方案是:

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

它使用carriage return 转到行首,然后打印与控制台宽度一样多的空格并再次返回到行首,因此您可以在之后打印自己的测试。

【讨论】:

对我来说它只适用于 Console.WindowWidth-1:Console.Write("\r" + new string(' ', Console.WindowWidth - 1) + "\r");【参考方案3】:

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

【讨论】:

这通常应该是对相应帖子的评论,因为它本身并不能回答问题。 当我没有足够的声誉时,我无法回复他们的帖子,我无法联系 cmets 的作者,因为找不到他们的电子邮件,并且没有必要发送相同的垃圾邮件(非原创)我的答案中的解决方案。 if (Console.CursorTop > 0) Console.SetCursorPosition(0, Console.CursorTop - 1);【参考方案4】:

这对我有用:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

(BufferWidth -1) 不会溢出行。【参考方案6】:

我们可以简单的写如下方法

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();

对我来说很好用。

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:
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);
    

【讨论】:

请解释你的答案,以便对未来的读者有用。【参考方案9】:

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

public static void ClearLine()

    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - (Console.WindowWidth >= Console.BufferWidth ? 1 : 0));

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

【讨论】:

【参考方案10】:

正如我所料,这对我来说非常适合 -

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

【讨论】:

以上是关于Console.Clear 可以用来只清除一行而不是整个控制台吗?的主要内容,如果未能解决你的问题,请参考以下文章

清除控制台 console

如何在IronPython控制台中清除屏幕?

C# WebBrowser 控件:清除缓存而不清除 cookie

清除发电机数据库表而不指定任何键

iPython/ Jupyter notebook 只清除一行输出

将内容插入到 innerHTML 中而不清除里面已有的内容