C ++ - 如何重置输出流操纵器标志

时间:2009-10-03 12:33:38

标签: c++ manipulators

我有一行代码在我的输出中将填充值设置为' - '字符,但需要将setfill标志重置为其默认的空白字符。我该怎么做?

cout << setw(14) << "  CHARGE/ROOM" << endl;
cout << setfill('-') << setw(11) << '-' << "  " << setw(15) << '-' << "   " << setw(11) << '-' << endl;

我认为这可行:

cout.unsetf(ios::manipulatorname) // Howerver I dont see a manipulator called setfill

我走错了路吗?

5 个答案:

答案 0 :(得分:26)

查看Boost.IO_State_Savers,为iostream的旗帜提供RAII风格的守卫。

示例:

#include <boost/io/ios_state.hpp>

{
  boost::io::ios_all_saver guard(cout); // Saves current flags and format

  cout << setw(14) << "  CHARGE/ROOM" << endl;
  cout << setfill('-') << setw(11) << '-' << "  " << setw(15) << '-' << "   " << setw(11) << '-' << endl;
// dtor of guard here restores flags and formats
}

更专业的防护装置(仅用于填充,宽度或精度等等)也在库中。有关详细信息,请参阅文档。

答案 1 :(得分:16)

您可以使用copyfmt来保存cout的初始格式。完成格式化输出后,您可以再次使用它来恢复默认设置(包括填充字符)。

{
    // save default formatting
    ios init(NULL);
    init.copyfmt(cout);

    // change formatting...
    cout << setfill('-') << setw(11) << '-' << "  ";
    cout << setw(15) << '-' << "   ";
    cout << setw(11) << '-' << endl;

    // restore default formatting
    cout.copyfmt(init);
}

答案 2 :(得分:9)

您可以使用ios::fill()功能来设置和恢复填充字符。

http://www.cplusplus.com/reference/iostream/ios/fill/

#include <iostream>
using namespace std;

int main () {
  char prev;

  cout.width (10);
  cout << 40 << endl;

  prev = cout.fill ('x');
  cout.width (10);
  cout << 40 << endl;

  cout.fill(prev);

  return 0;
}

答案 3 :(得分:1)

您可以手动将setfill标志更改为您需要的任何内容:

float number = 4.5;
cout << setfill('-');
cout << setw(11) << number << endl; // --------4.5
cout << setfill(' ');
cout << setw(11) << number << endl; // 4.5

答案 4 :(得分:-2)

null字符会将其重置为原始状态: setfill('\0')