2009-10-03 3 views
15

У меня есть строка кода, которая задает значение заполнения символу '-' в моем выводе, но нужно сбросить флаг setfill до символа пробела по умолчанию. Как мне это сделать?C++ - Как сбросить флаги манипулятора выходного потока

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 

я на ложном пути?

ответ

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; 
} 
26

Посмотрите на 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 
} 

Более специализированные защитные ограждения (только для заполнения, или ширина, или точность, и т.д. ... Также в библиотеке смотрите документацию для деталей

+0

Великий ответ, должен быть принят один. – gd1

+3

@ gd1: Хороший ответ, но не _great_, так как я должен включить Boost только для сохранения флагов iostream. – Isaac

+1

@ Исаак: на C++ мне кажется, что вы либо используете boost, либо в конечном итоге переопределяете его, либо ждете Boost. Что-то должно быть включено в стандарт. – gd1

11

Вы можете использовать.. 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); 
} 
+0

Удивленный никто не опубликовал это раньше :) Роллинг в охранник RAII был бы хорош, хотя, если будет исключено исключение. Запущены в эту проблему в рамках ведения журнала. –

+0

Это работает на всех системах? Когда я пытаюсь, мой std :: cout отказывается выводить что-нибудь после ... когда-либо! – BitTickler

1
// 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 
+2

Это устанавливает значение '' '', которое может быть или не быть значением, которое оно имело до первого 'setfill'. –

0

Нулевой символ будет сбросить его обратно в исходное состояние: setfill('\0')

Смежные вопросы