我有一行代码在我的输出中将填充值设置为' - '字符,但需要将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
我走错了路吗?
答案 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')