如何使用setw和setfill多次重置cout中的格式化函数

时间:2015-01-23 23:10:34

标签: c++

如何反复使用setfillsetw之类的io操纵器,而不会破坏在另一个之下发生的输出我想问的是我想创建一个不使用win32的基于文本的窗口函数,但在命令提示符下制作版本我尝试使用IO操纵器使用我在程序中选择的字符创建窗口的形状,但会发生什么

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

希望用x&#39; s填充顶部并单独留下底部并设置标题栏变量的底部

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 个答案:

答案 0 :(得分:2)

我不能说我完全理解这个问题,但重置填充和宽度可以如下所示:

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 的宽度设置为提供的参数。正如我之前所说,宽度仅应用于下一个打印元素,因此值 style width 字符在空字符串之前打印:

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

在下一行中,我们只恢复原始填充值,这很可能只是一个空格:

cout.fill(prev_char);

然后我们打印标题栏和按钮,但我们应用新的宽度,以便我们可以用空格填充标题栏文本和按钮之间的空格:

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

最后,我们打印另一行 x 大小 width ,但由于我们已经将原始填充字符存储在变量中,我们可以直接使用setfill函数:

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