2009-10-03 5 views
15

मुझे कोड की एक पंक्ति मिली है जो मेरे आउटपुट में '-' चरित्र को भरने का मान सेट करता है, लेकिन सेटफिल ध्वज को अपने डिफ़ॉल्ट व्हाइटस्पेस वर्ण में रीसेट करने की आवश्यकता है। मैं उसको कैसे करू? गलत ट्रैक परसी ++ - आउटपुट स्ट्रीम मैनिपुलेटर झंडे को रीसेट करने के लिए कैसे करें

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

एम आई:

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

मुझे लगा कि यह काम हो सकता है?

उत्तर

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

एक iostream के झंडे के लिए आरए II शैली गुंजाइश गार्ड उपलब्ध कराने, Boost.IO_State_Savers पर एक नज़र डालें।

उदाहरण:

#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_ नहीं, क्योंकि मुझे केवल Iostream झंडे को बचाने के लिए बूस्ट शामिल करना है। – Isaac

+1

@Isaac: सी ++ में, मुझे लगता है कि आप या तो इसे बढ़ावा देने या इसे पुन: कार्यान्वित करने का अंत करते हैं, या बूस्ट के लिए प्रतीक्षा करें। मानक में कुछ शामिल किया जाना चाहिए। – gd1

11

आप उपयोग कर सकते हैं।। copyfmt अदालत की प्रारंभिक स्वरूपण को बचाने के लिए। एक बार जब स्वरूपित उत्पादन के साथ समाप्त हो गया आप (चरित्र भरने सहित) डिफ़ॉल्ट सेटिंग पुनर्स्थापित करने के लिए इसे फिर से उपयोग कर सकते हैं।

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

आश्चर्यचकित कोई भी इसे पहले पोस्ट नहीं किया :) इसे एक आरएआईआई गार्ड में घुमाएगा हालांकि, अगर कोई अपवाद फेंक दिया जाता है तो अच्छा होगा। एक लॉगिंग ढांचे में उस मुद्दे में भाग लिया है। –

+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')

संबंधित मुद्दे