C# 控制台 - 如何在没有新行的情况下读取 ReadLine()? (或撤消 a\n 或垂直\b)

标签 c# console newline edit console.readline

我想知道当我在下一行的开头时是否可以回到最后一行? (当然是在 C# 控制台中)

我的意思是 Console.WriteLine() 导致转到下一行,即使在按下 enter 后我也想留在我的行中。 (而且我认为没有另一种方法可以在不转到下一行的情况下读取 ReadLine,是吗?)

我发现 Console.SetCursorPosition() 很有用,如下所示:

        int x, y;
        Console.WriteLine("Please enter the point's coordinates in this form (x,y):");
        Console.Write("(");
        x = Convert.ToInt32(Console.ReadLine());
        Console.SetCursorPosition(x.ToString().Length + 1, Console.CursorTop - 1);
        Console.Write(",");
        y = Convert.ToInt32(Console.ReadLine());
        Console.SetCursorPosition(x.ToString().Length + y.ToString().Length + 2, Console.CursorTop - 1);
        Console.WriteLine(")");

这似乎工作正常但是当我尝试更改 Console.Write("("); 变成类似 Console.Write("Point A=(") 的东西,我每次都需要更改 Console.SetCursorPosition() 参数。

如果我可以将光标移动到控制台缓冲区中的最后一个字符(空格除外),这将非常有帮助。(我认为如果我可以将特定行从控制台复制到字符串中会很容易。)

提前致谢。

最佳答案

如何使用适合您的特定用例并有助于使您的代码逻辑更具可读性的简单帮助程序类。

public class Prompt
{
    public struct CursorPosition
    {
        public int CursorLeft;
        public int CursorTop;
    }

    private CursorPosition _savedPosition;

    public Prompt Write(string prompt)
    {
        Console.Write(prompt);
        return this;
    }

    public Prompt Write(string promptFormat, params object[] args)
    {
        return Write(string.Format(promptFormat, args));
    }

    public Prompt WriteLine(string prompt)
    {
        Write(prompt);
        Console.WriteLine();
        return this;
    }

    public Prompt WriteLine(string promptFormat, params object[] args)
    {
        return WriteLine(string.Format(promptFormat, args));
    }

    public string ReadLine(bool advanceCursorOnSameLine = false, bool eraseLine = false)
    {
        if (advanceCursorOnSameLine || eraseLine)
        {
            SavePosition();
            if (eraseLine)
                WriteLine(new string(' ', Console.WindowWidth - _savedPosition.CursorLeft)).RestorePosition();
        }
        var input = Console.ReadLine();
        if (advanceCursorOnSameLine)
            RestorePosition(input.Length);
        return input;
    }

    public Prompt SavePosition()
    {
        _savedPosition = GetCursorPosition();
        return this;
    }

    public CursorPosition GetCursorPosition()
    {
        return new CursorPosition {
            CursorLeft = Console.CursorLeft,
            CursorTop = Console.CursorTop
        };
    }

    public Prompt RestorePosition(CursorPosition position, int deltaLeft = 0, int deltaTop = 0)
    {
        var left = Math.Min(Console.BufferWidth - 1, Math.Max(0, position.CursorLeft + deltaLeft));
        var right = Math.Min(Console.BufferHeight - 1, Math.Max(0, position.CursorTop + deltaTop));
        Console.SetCursorPosition(left, right);
        return this;
    }

    public Prompt RestorePosition(int deltaLeft = 0, int deltaTop = 0)
    {
        return RestorePosition(_savedPosition, deltaLeft, deltaTop);
    }
}

然后可以这样使用:

class Program
{
    public static void Main(params string[] args)
    {
        int x, y;
        var prompt = new Prompt();
        prompt.WriteLine("Please enter the point's coordinates in this form (x,y):");
        var savedPos = prompt.GetCursorPosition();
        while (true)
        {
            x = Convert.ToInt32(prompt.Write("(").ReadLine(true, true));
            y = Convert.ToInt32(prompt.Write(",").ReadLine(true));
            prompt.WriteLine(")");
            // do something with x and y

            var again = prompt.Write("More (Y):").ReadLine(true, true);
            if (!again.StartsWith("Y", StringComparison.OrdinalIgnoreCase))
                break;
            prompt.RestorePosition(savedPos);
        }
    }
}

关于C# 控制台 - 如何在没有新行的情况下读取 ReadLine()? (或撤消 a\n 或垂直\b),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499132/

相关文章:

c# - LINQ 中 select 中的 cast 和 as 之间的区别

c# - UDP 广播不能在 Windows 8 中的同一台机器上工作

C++:无法删除输出前已打印到控制台的字符

c# - 使用 .NET 4.5 编写的 Windows 服务中的 Console.Out 和 Console.Error 竞争条件错误

c - 使用 InfluxDB 提高每秒写入点数

c++ - 为什么我的字符串标记在我的 c++ bison 程序中最终减少时会换行?

c# - TFS checkin 政策 - 最佳实践

ruby-on-rails - 在 Heroku 控制台上运行循环或多行代码

命令行、引号和新行上的 Powershell 内联命令

c# - 任务中的错误处理