С++ - Как reset флаги манипулятора потока вывода
У меня есть строка кода, которая устанавливает значение заполнения символу '-' в моем выводе, но для reset флаг 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
Неужели я ошибаюсь?
Ответы
Ответ 1
Посмотрите Boost.IO_State_Savers, предоставляя защитные рамки уровня в стиле RAII для флагов iostream.
Пример:
#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
}
В библиотеке также находятся более специализированные охранники (только для заполнения, или ширины, или точности, и т.д.). Подробнее см. в документах.
Ответ 2
Вы можете использовать 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);
}
Ответ 3
Вы можете использовать функцию 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;
}
Ответ 4
// simply set it back
float number = 4.5;
cout << setfill('-');
cout << setw(11) << number << endl; // --------4.5
cout << setfill(' ');
cout << setw(11) << number << endl; // 4.5
Ответ 5
Нулевой символ вернет reset в исходное состояние:
setfill('\0')