2012-06-27 79 views
12

Trong mã C++, tôi có ma trận của các biến kép mà tôi in ra. Tuy nhiên, vì tất cả chúng có số chữ số khác nhau, định dạng đầu ra bị hủy. Một giải pháp là làm cout.precision(5) nhưng tôi muốn các cột khác nhau có độ chính xác khác nhau. Ngoài ra, bởi vì có những giá trị âm trong một số trường hợp, sự hiện diện của các dấu hiệu - cũng gây ra vấn đề. Làm thế nào để có được điều này và tạo ra một đầu ra được định dạng đúng?Đầu ra định dạng trong C++

Trả lời

10

Tắt đầu, bạn có thể sử dụng setw (int) để xác định chiều rộng đầu ra.

như thế này:

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; 

cho này:

0.2 123456 
    0.12 123456789 
+0

chỉ là FYI: trong khi thực hiện std :: setw (x), hãy đảm bảo x lớn hơn độ chính xác thập phân của bạn. – solti

4

Sử dụng manipulators.

Từ mẫu 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'; 
} 

Output:

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

Hãy nhìn vào dòng manipulators, đặc biệt là std::setwstd::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

Có cách sử dụng i/o thao tác, nhưng tôi thấy khó sử dụng. Tôi sẽ chỉ viết một chức năng như sau:

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

Điều quan trọng là, như những người khác đã nói, sử dụng thao tác. Những gì họ bỏ qua để nói là bạn thường sử dụng các thao tác mà bạn tự viết . Một FFmt thao túng (tương ứng với định dạng F trong Fortran là khá dễ dàng:

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

Bằng cách này, bạn có thể định nghĩa một biến cho mỗi cột, nói:

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

và viết:

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

Nói chung, ngoại trừ trong các chương trình đơn giản nhất, có thể bạn không nên là bằng cách sử dụng tiêu chuẩn những người thao túng, mà là những người thao túng tùy chỉnh dựa trên đơn đăng ký của bạn ; ví dụ. temperaturepressure nếu đó là loại điều bạn đang xử lý. Theo cách này, rõ ràng là mã số bạn đang định dạng và nếu khách hàng đột nhiên yêu cầu thêm một chữ số ở số áp lực, bạn biết chính xác nơi cần thực hiện thay đổi.

+0

Hãy nhớ rằng bạn cần phải bao gồm để làm cho nó tìm thấy setw() – user1603472

+1

@ user1603472 Có, nhưng mã của tôi không sử dụng 'std :: setw'. –

+0

xin lỗi, xấu của tôi, tôi đã nhấp nhầm địa điểm, là một nhận xét nhanh để đưa vào – user1603472

Các vấn đề liên quan