С++ - Как 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')