2013-02-25 8 views
4

То, что я хочу сделать:Выемка только часть консольного вывода

Курсор первоначально мигающего в левом верхнем углу экрана:

160 Осталось символов
_

Когда я нажимаю 'я':

159 Осталось символов

я

Когда я нажимаю 'а':

158 Осталось символов

И.

Когда я нажимаю 'м':

157 Остальные

РМКО

и так далее символов.

Что должно быть сделано (по мне):

  1. нужно очистить только первые три символа на экране.
  2. Update вновь нажал клавишу на экране

То, что я пробовал:

Я попытался очистить весь экран и написать все, что там было раньше вернуться на него.

Почему я не доволен тем, что я сделал:

Потому что это дает прерывистый вид. И запись негладкая.

Что мне нужно, чтобы ты помог мне:

Некоторые встроенной функции или какой-либо другой техники, чтобы очистить только часть экрана.

Мои характеристики:

Windows XP SP 3

IDE: Visual C++ 2010 Express

+0

На какой платформе вы стремитесь? В Linux ncurses будет приветствовать помощь в управлении экраном терминала. – aggsol

+0

Я работаю на машине с Windows – IcyFlame

+0

Не уверен, что консоль в окнах имеет такую ​​функциональность, но вы можете попробовать использовать [PDCurses] (http://pdcurses.sourceforge.net/doc/index.html), который является портом Windows для библиотеки Curses –

ответ

5

Первое, что нужно понять, что C++ не имеет ни малейшего представления на экране, в качестве стандартной части языка. Стандартным выходом может быть файл, принтер и cout не знают разницы.

Сам экран «устройство», как правило, немного умнее и распознает некоторые команды. Наиболее широко реализуемыми из них являются «\ r» - возврат каретки и «\ n» - линия. «\ r» перемещает курсор в начало строки, а «\ n» переходит к следующей строке, но это не соответствует вашим потребностям, как вы уже пробовали.

Кажется, что единственный путь вперед - использовать проклятия (из которых ncurses - это только одна реализация, хотя стандартная в Linux). Он представляет вам виртуальный экран с различными командами для их обновления. Затем он принимает только измененные части и оптимизирует терминал.

Это просто пример типичной программы С помощью Ncurses, может быть стоит посмотреть:

#include <ncurses.h> 

int main() 
{ 
    int ch; 

    initscr();    /* Start curses mode  */ 
    raw();     /* Line buffering disabled */ 
    keypad(stdscr, TRUE); /* We get F1, F2 etc..  */ 
    noecho();    /* Don't echo() while we do getch */ 

    printw("Type any character to see it in bold\n"); 
    ch = getch();   /* If raw() hadn't been called 
          * we have to press enter before it 
          * gets to the program  */ 

    printw("The pressed key is "); 
    attron(A_BOLD); 
    printw("%c", ch); 
    attroff(A_BOLD); 

    refresh();   /* Print it on to the real screen */ 
    getch();   /* Wait for user input */ 
    endwin();   /* End curses mode  */ 

    return 0; 
} 

Функция printw() записывает в «воображаемой» экраном. Он помещает материал в буфер и обновляет некоторые флаги, а также выполняет некоторые другие внутренние операции с ncurses. На самом деле он ничего не записывает на ваш реальный экран (консольное окно).

Вы можете сделать столько printw(), сколько хотите, но материал не отображается на реальном экране, пока ваша программа не сделает что-то еще, чтобы вызвать «мнимое» содержимое экранного буфера, чтобы перейти к реальному экран.

Одна вещь, которая заставляет реальный экран обновляться из буфера printw(), обновляется() (как показывает пример исходного кода).

+0

Wow вы изобретатель AK47 и других винтовок? : -O –

+1

Однажды я решил, что лучше пойти на какие-то мирные вещи, а почему бы и нет C++? Jk, это просто совпадение. :) –

+0

Эй, эй, подождите секунду здесь. Вы говорите, что запись raw() отключает буфер. Означает ли это, что все введенные символы без буфера и с noecho() без эха тоже? – IcyFlame

1

Если вы хотите управлять полным экраном, curses - это путь . В противном случае вы можете сделать многое, просто используя escape-последовательности; смотрите http://en.wikipedia.org/wiki/ANSI_escape_code, например. (Исторически такие последовательности менялись от одного терминала до , и проклятия изначально были способом работы вокруг этого. Сегодня escape-коды ANSI довольно универсальны для консолей окон под системой окон, используемых обеими Windows окна консоли и Xterm.)

В дополнение к инкапсулирования фактические последовательности, curses поддерживает ввод символов ориентированных, с или без эхо-сигнала. Это труднее обойтись без проклятий, и все еще очень unportable.

+0

Спасибо @James Kanze – IcyFlame

2

Win32 Консоль не поддерживает escape-последовательности. Вы можете использовать Console API.

Крошечный пример, который очищает первые 3 символа в точке (0, 0) из консоли

#include <windows.h> 

int main() 
{ 
    HANDLE hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); 

    COORD coord = {0,0}; 
    ::SetConsoleCursorPosition(hOutput, coord); 

    char buff[] = " "; 
    ::WriteConsoleA(hOutput, buff, 3, NULL, NULL); 

    return 0; 
} 

Если вам не нравится Console API и хотите использовать ncurses аналог см there.

+0

Ну, пожалуйста, скажите мне, изменит ли это положение курсора или просто распечатает эти вещи в упомянутом положении? ' – IcyFlame

+0

'SetConsoleCursorPosition' изменяет положение курсора на' (0,0) ', а затем' WriteConsoleA' записывает три пробела, начиная с этой позиции. – Stas

Смежные вопросы