Есть ли способ удалить только что написанный символ с использованием Console.WriteLine? - PullRequest
40 голосов
/ 04 марта 2011

Есть ли способ удалить последний символ из консоли, т.е.

Console.WriteLine("List: apple,pear,");
// Somehow delete the last ',' character from the console.
Console.WriteLine(".");
// Now the console contains "List: apple,pear."

Конечно, я мог бы сначала создать строку, а затем распечатать ее на консоли, но мне просто интересно посмотреть, смогу ли я удалить символы прямо из консоли.

Ответы [ 7 ]

59 голосов
/ 04 марта 2011

"\ b" является ASCII backspace. Распечатайте его, чтобы создать резервную копию одного символа.

    Console.Write("Abc");
    Console.Write("\b");
    Console.Write("Def");

выходы "AbDef";

Как указывают Контанго и Сэмми, бывают случаи, когда требуется перезапись пробелом:

    Console.Write("\b \b");
41 голосов
/ 25 июня 2014

Console.Write("\b \b"); это, вероятно, то, что вы хотите. Удаляет последний символ и перемещает карету обратно.

\b Символ возврата на обратную позицию только перемещает каретку назад. Это не перемещение последнего символа. Таким образом, Console.Write("\b"); только перемещает курсор назад на один, оставляя последний символ все еще видимым.

Console.Write("\b \b"); однако, сначала перемещает курсор назад, затем записывает символ пробела, который перезаписывает последний символ и снова перемещает курсор вперед. Поэтому мы пишем секунду \b, чтобы снова переместить каретку обратно. Теперь мы сделали то, что обычно делает кнопка возврата.

16 голосов
/ 04 марта 2011

Это поможет, если вы используете Write вместо WriteLine.

Console.Write("List: apple,pear,");
Console.Write("\b");  // backspace character
Console.WriteLine(".");

Но у вас действительно есть большой контроль над консолью. Вы можете написать в любое место, которое вы хотите. Просто используйте метод Console.SetCursorPosition(int, int).

4 голосов
/ 20 мая 2014

, если вы хотите удалить только один символ, который вы можете использовать:

Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); и Console.Write() снова.

если вы хотите удалить более одного символа, например, автоматизацию, вы можете сохранить текущий Console.CursorLeft в переменной и использовать это значение в Console.SetCursorPosition(--variablename, Console.CursorTop) в цикле, чтобы удалить столько символов, сколько вам нужно!

3 голосов
/ 22 апреля 2014

Вышеуказанные решения прекрасно работают, если вы не выполняете итерацию цикла for или foreach. В этой ситуации вы должны использовать другой подход, например

 Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
 Console.WriteLine(" ");

Однако, это хорошо работает и для соединения строк.

Примеры:

List<int> myList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

for (int i = 0; i < myList.Count; i++)
{
    Console.Write(myList[i] + ", ");
}

Console.WriteLine("\b\b"); //this will not work.

foreach (int item in myList)
{
    Console.Write(item + ", ");
}

//this will work:
Console.SetCursorPosition(Console.CursorLeft - 2, Console.CursorTop);
Console.WriteLine("  ");

//you can also do this, btw
Console.WriteLine(string.Join(", ", myList) + "\b\b");
2 голосов
/ 30 декабря 2018

Чтобы правильно удалить символ в консоли, используйте

Console.Write("\x1B[1D"); // Move the cursor one unit to the left
Console.Write("\x1B[1P"); // Delete the character

Это правильно удалит символ перед курсором и переместит все последующие символы назад.Используя

Console.Write("\b \b");

, вы будете заменять символ перед курсором только пробелом, а не удалить it!

1 голос
/ 04 марта 2011

Вы можете очистить консоль, а затем записать новый вывод.

...