2012-06-27 20 views
12

में आउटपुट स्वरूपण एक सी ++ कोड में मेरे पास डबल चर के मैट्रिक्स हैं जो मैं प्रिंट करता हूं। हालांकि, उनमें से सभी के पास अंकों की अलग-अलग संख्या है, आउटपुट प्रारूप नष्ट हो गया है। एक समाधान cout.precision(5) करना है, लेकिन मैं चाहता हूं कि अलग-अलग स्तंभों में एक अलग सटीकता हो। इसके अलावा, क्योंकि कुछ मामलों में नकारात्मक मूल्य हैं, - संकेत की उपस्थिति भी समस्याओं का कारण बनती है। इसके चारों ओर कैसे प्राप्त करें और एक उचित रूप से स्वरूपित आउटपुट का उत्पादन कैसे करें?सी ++

उत्तर

10

मेरे सिर के ऊपर बंद, आप उत्पादन की चौड़ाई निर्दिष्ट करने के लिए setw (int) का उपयोग कर सकते हैं।

इस तरह:

std::cout << std::setw(5) << 0.2 << std::setw(10) << 123456 << std::endl; 
std::cout << std::setw(5) << 0.12 << std::setw(10) << 123456789 << std::endl; 

इस देता है:

0.2 123456 
    0.12 123456789 
+0

बस FYI: std :: setw (x) करते समय सुनिश्चित करें कि एक्स आपके दशमलव परिशुद्धता से अधिक है। – solti

4

manipulators का उपयोग करें।

नमूना here से:

#include <iostream> 
#include <iomanip> 
#include <locale> 
int main() 
{ 
    std::cout.imbue(std::locale("en_US.utf8")); 
    std::cout << "Left fill:\n" << std::left << std::setfill('*') 
       << std::setw(12) << -1.23 << '\n' 
       << std::setw(12) << std::hex << std::showbase << 42 << '\n' 
       << std::setw(12) << std::put_money(123, true) << "\n\n"; 

    std::cout << "Internal fill:\n" << std::internal 
       << std::setw(12) << -1.23 << '\n' 
       << std::setw(12) << 42 << '\n' 
       << std::setw(12) << std::put_money(123, true) << "\n\n"; 

    std::cout << "Right fill:\n" << std::right 
       << std::setw(12) << -1.23 << '\n' 
       << std::setw(12) << 42 << '\n' 
       << std::setw(12) << std::put_money(123, true) << '\n'; 
} 

आउटपुट:

Left fill: 
-1.23******* 
0x2a******** 
USD *1.23*** 

Internal fill: 
-*******1.23 
0x********2a 
USD ****1.23 

Right fill: 
*******-1.23 
********0x2a 
***USD *1.23 
1

धारा manipulators पर एक नजर डालें, विशेष रूप से std::setw और std::setfill

float f = 3.1415926535; 
std::cout << std::setprecision(5) // precision of floating point output 
      << std::setfill(' ')  // character used to fill the column 
      << std::setw(20)   // width of column 
      << f << '\n';    // your number 
0

आई/ओ मैनिपुलेटर्स का उपयोग करने का एक तरीका है, लेकिन मुझे यह अनावश्यक लगता है। मैं सिर्फ इस तरह एक समारोह लिखते थे:

template<typename T> 
std::string RightAligned(int size, const T & val) 
{ 
    std::string x = boost::lexical_cast<std::string>(val); 
    if (x.size() < size) 
     x = std::string(size - x.size(), ' ') + x; 
    return x; 
} 
12

कुंजी के रूप में अन्य लोगों ने कहा, है, manipulators उपयोग करने के लिए। वे कहने के लिए उपेक्षित है कि आप आमतौर पर मैनिपुलेटर्स का उपयोग करते हैं जिन्हें आप लिखते हैं। एक FFmt जोड़तोड़ (जो फोरट्रान में F प्रारूप से मेल खाती है काफी आसान है:

class FFmt 
{ 
    int myWidth; 
    int myPrecision; 
public: 
    FFmt(int width, int precision) 
     : myWidth(width) 
     , myPrecision(precision) 
    { 
    } 

    friend std::ostream& 
    operator<<(std::ostream& dest, FFmt const& fmt) 
    { 
     dest.setf(std::ios_base::fixed, std::ios_base::formatfield); 
     dest.precision(myPrecision); 
     dest.width(myWidth); 
     return dest; 
    } 
}; 

इस तरह, आप प्रत्येक स्तंभ के लिए एक चर परिभाषित कर सकते हैं, कहते हैं:

FFmt col1(8, 2); 
FFmt col2(6, 3); 
// ... 

और लिखें:

std::cout << col1 << value1 
    << ' ' << col2 << value2... 

सामान्यतः, सरलतम कार्यक्रमों को छोड़कर, आपको मानक का उपयोग करके नहीं होना चाहिए मैनिपुलेटर्स, बल्कि पर आधारित कस्टम मैनिपुलेटर्स; जैसे temperature और pressure यदि यह की तरह है जो आपके साथ काम करता है। इस तरह, यह कोड में स्पष्ट है कि आप स्वरूपण कर रहे हैं, और यदि ग्राहक अचानक दबाव में एक और अंक मांगता है, तो आप जानते हैं कि परिवर्तन कहां करना है।

+0

याद रखें कि आपको इसे सेट करने के लिए शामिल करना होगा() – user1603472

+1

@ user1603472 हाँ, लेकिन मेरा कोड 'std :: setw' का उपयोग नहीं करता है। –

+0

क्षमा करें, मेरे बुरे, मैंने गलत जगह पर क्लिक किया, एक त्वरित टिप्पणी डाली गई – user1603472