Избегайте прокрутки консоли в C ++ с использованием std :: cout - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь перенести эту функцию (написанную на FreeBasic) на C ++. Следующий код напечатает рамку символа по краю окна консоли:

#Define HORIZONTAL_SYMBOL 205
#Define VERTICAL_SYMBOL 186
#Define TOP_LEFT_CORNER 201
#Define TOP_RIGHT_CORNER 187
#Define BOTTOM_LEFT_CORNER 200
#Define BOTTOM_RIGHT_CORNER 188

Sub print_frame(ByVal max_column As Short = 80, ByVal max_row As Short = 25, ByVal start_x As Short = 1, ByVal start_y As Short = 1)

    Dim As Byte cycles

    'Print top line
    Locate(start_y,start_x)
    ? Tab(start_x); Chr(TOP_LEFT_CORNER); String(max_column-2, Chr(HORIZONTAL_SYMBOL)); Chr(TOP_RIGHT_CORNER);

    'Body
    Do
        cycles += 1
        ? Tab(start_x); Chr(VERTICAL_SYMBOL); Tab(max_column+start_x-1); 
        Chr(VERTICAL_SYMBOL);
    Loop Until cycles = max_row-2

    'Print bottom line
    ? Tab(start_x); Chr(BOTTOM_LEFT_CORNER); String(max_column-2,         
    Chr(HORIZONTAL_SYMBOL)); Chr(BOTTOM_RIGHT_CORNER);
End Sub

Screen 0
print_frame()
GetKey

Обратите внимание на операцию Screen 0, она инициализирует режим консоли Windows с 80 столбцами / 25 строками (что-то, что я еще не нашел эквивалента / замены в C ++). Чтобы установить этот режим вручную, запустите оболочку Windows, щелкните правой кнопкой мыши значок программы на панели программ и выберите «Свойства» (надеюсь, это называется, моя установка Windows выполнена на немецком языке). В новом окне выберите вкладку «Макет» и установите размер буфера и размер окна на 80x25.

Пожалуйста, игнорируйте строки #define, программа использует различные символы в Linux.

Это была моя попытка портировать эту функцию на C ++:

#include "rlutil.h"

void print_frame(short int max_column = rlutil::tcols(), short int max_row = rlutil::trows(), short int x = 1, short int y = 1) {
    short int cycles = 0;

    // Print top line
    rlutil::locate(x,y);
    std::cout << char (201) << std::string(max_column-2, 205) << char (187);

    // Body
    while (cycles < max_row-2) {
        cycles++;
        rlutil::locate(x,y+cycles);
        std::cout << char (186) << std::string(max_column-2, 0) << char (186);
    }

    // Print bottom line
    rlutil::locate(x,y+max_row-1);
    std::cout << char (200) << std::string(max_column-2, 205) << char (188);
}

int main () {
    print_frame();
}

В приведенном выше коде используется функция с именем rlutil::locate(), которая не написана мной, и часть библиотеки с именем "rlutils.h" (поищите в Google, если она вам нужна). Другие библиотечные функции rlutil::tcols() и rlutil::trows() возвращают количество строк и столбцов окна консоли.

Моя проблема / вопрос в том, что, хотя функция FreeBasic не прокручивает текст вниз (что приведет к обрезанию верхней границы), код C ++ делает. Как я могу избежать этого поведения?

РЕДАКТИРОВАТЬ: я нашел способ предотвратить прокрутку, используя putchar() (выведите все символы, кроме последнего, с помощью std::cout и поместите последний символ с помощью putchar()), но я все еще ищу более простой способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...