как сбросить функции форматирования в cout, используя setw и setfill несколько раз

Как я могу использовать такие манипуляторы, как setfill а также setw неоднократно, не нарушая вывод, который происходит ниже другого, что я спрашиваю, я хочу создать текстовое окно, не используя функции win32, но сделанную версию в командной строке, я пытаюсь использовать IO манипуляторы, чтобы создать форму окна используя персонаж, которого я выбрал в своей программе, но что происходит,

cout  <<setfill(width) << setfill(style)

хотите заполнить верхнюю часть с помощью x, оставьте только нижнюю часть и установите нижнюю часть переменной строки заголовка

cout  <<endl<< titleBar << setw(width) << "[_][]][x]" << endl;

#include <iostream>
#include <iomanip>
using namespace std;class window
{
public:
window(const char * title)
{
windowTitle = title;
}

void createWindow(int width,int height,char windowStyle,const char * titleBar,const char * windowClass)
{
char style = windowStyle;
cout <<setw(width) <<setfill(style) <<setw(0) <<endl;
cout << titleBar << setw(width) << "[_][]][x]" <<endl;
cout <<setw(width) <<setfill(style) <<setw(0) <<endl;
}

const char * getTitle() const { return windowTitle; }
private:
const char * windowTitle;
const char * windowClass;

};

int main ()
{
window myWindow("Windows Programming");
myWindow.createWindow(50,100,'x',myWindow.getTitle(),"windowclass");

system("pause");

return 0;
}

1

Решение

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

void createWindow(int width,int height,char windowStyle,const char * titleBar,const char * windowClass)
{
char style = windowStyle;

char prev_char = cout.fill(style);

cout << setw(width) << "" << endl;

cout.fill(prev_char);

cout << titleBar << setw(width - strlen(titleBar)) << "[_][]][x]" <<endl;

cout << setw(width) << setfill(style) << "" << endl;
}

Основная идея состоит в том, чтобы использовать соответствующие функции-члены из cout, которые возвращают предыдущее значение, которое вы можете позже использовать для сброса заполнения / ширины. Запуск этого кода даст следующий результат:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Windows Programming                      [_][]][x]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Обновить:

Я обновил код, чтобы дать вам лучшее объяснение.

функции setw и setfill в основном модифицируют некоторые внутренние флаги / переменные std :: ostream. setfill постоянно изменяет символ заливки, но setw изменяет только ширину следующего элемента. Итак, давайте проанализируем код.

Вместо использования setfill, я вызываю метод напрямую из std :: ostream, чтобы установить значение заполнения. Основная причина, по которой я это делаю, заключается в том, что она возвращает предыдущее значение, которое она содержала, чтобы я мог восстановить позже:

char prev_char = cout.fill(style);

Следующим шагом будет распечатать «строку заголовка» или как бы вы ее не называли. Для этого я установил ширину с setw к предоставленному параметру. Как я уже говорил, ширина применяется только к следующему печатному элементу, поэтому ширина символы значения стиль печатаются перед пустой строкой:

cout << setw(width) << "" << endl;

В следующей строке мы просто восстанавливаем исходное значение заполнения, которое, скорее всего, просто пробел:

cout.fill(prev_char);

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

cout << titleBar  << setw(width - strlen(titleBar)) << "[_][]][x]" <<endl;

Наконец, мы печатаем еще одну строку иксы размера ширина, но поскольку у нас уже есть оригинальный символ заполнения, сохраненный в переменной, мы можем напрямую использовать функцию setfill:

cout << setw(width) << setfill(style) << "" << endl;
2

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


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