2009-10-03 12 views
15

Tôi có một dòng mã đặt giá trị điền vào ký tự '-' trong đầu ra của tôi, nhưng cần đặt lại cờ setfill thành ký tự trắng khoảng trắng mặc định. Làm thế nào để làm điều đó?C++ - Cách đặt lại cờ thao tác dòng đầu ra

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

Tôi nghĩ điều này có thể làm việc:

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

Am tôi trên đường đua sai?

Trả lời

9

Bạn có thể sử dụng chức năng ios::fill() để đặt và khôi phục ký tự điền.

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

Có một cái nhìn tại Boost.IO_State_Savers, cung cấp bảo vệ phạm vi RAII kiểu cho lá cờ của một iostream.

Ví dụ: bảo vệ

#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 
} 

Nhiều chuyên (chỉ dành cho điền vào, hoặc chiều rộng, hay chính xác, vv ... cũng có trong thư viện Xem các tài liệu để biết chi tiết

+0

Great câu trả lời, nên chấp nhận một. – gd1

+3

@ gd1: Câu trả lời hay, nhưng không phải là _great_, vì tôi phải đưa Boost chỉ để lưu cờ iostream. – Isaac

+1

@Isaac: trong C++, có vẻ như với tôi rằng bạn hoặc sử dụng tăng hoặc kết thúc reimplementing nó, hoặc chờ cho Boost.Something được bao gồm trong tiêu chuẩn. – gd1

11

Bạn có thể sử dụng.. copyfmt để lưu định dạng ban đầu cout của. Sau khi hoàn tất với định dạng đầu ra, bạn có thể sử dụng nó một lần nữa để khôi phục lại các thiết lập mặc định (bao gồm điền nhân vật).

{ 
    // 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

Ngạc nhiên không ai được đăng này sớm hơn :) Cán nó vào một bảo vệ RAII sẽ là tốt mặc dù, trong trường hợp ngoại lệ được ném. Đã chạy vào vấn đề đó trong một khung đăng nhập. –

+0

Điều đó có hoạt động trên tất cả các hệ thống không? Khi tôi thử nó, std của tôi :: cout từ chối sản xuất bất cứ điều gì sau khi ... bao giờ hết! – 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

Điều đó đặt nó thành '''', có thể hoặc không thể là giá trị mà nó có trước 'setfill' đầu tiên. –

0

Các ký tự null sẽ thiết lập lại nó trở lại tình trạng ban đầu: setfill('\0')