Избегайте прокрутки консоли в C ++, используя std :: cout

Я пытаюсь портировать эту функцию (написана на 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 выполнена на немецком языке). В новом окне выберите вкладку «Макет» и установите размер буфера и размер окна на 80×25.

Пожалуйста, игнорируйте #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()), но я все еще ищу более ясный способ сделать это.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]