2010-03-21 64 views
54

Có cách nào căn chỉnh văn bản khi in bằng cách sử dụng std::cout không? Tôi đang sử dụng các tab, nhưng khi các từ quá lớn, chúng sẽ không được căn chỉnh nữa.Căn chỉnh C++ khi in ấn <<

Sales Report for September 15, 2010 
Artist Title Price Genre Disc Sale Tax Cash 
Merle Blue 12.99 Country 4% 12.47 1.01 13.48 
Richard Music 8.49 Classical 8% 7.81 0.66 8.47 
Paula Shut 8.49 Classical 8% 7.81 0.72 8.49 
+2

Các câu trả lời dưới đây cho phép xác định chiều rộng của cột. Lưu ý rằng điều này yêu cầu bạn biết một giới hạn trên (ví dụ ràng buộc cơ sở dữ liệu) hoặc tính toán trước nó (có thể có nghĩa là phân tích toàn bộ cấu trúc trước khi bắt đầu in nó). Thứ hai, mặc dù cần thiết, chậm hơn tất nhiên :) –

Trả lời

7

Chức năng thao tác setw sẽ được trợ giúp tại đây.

+3

Bạn cũng nên đề cập đến 'left' và' right' cho phép chỉ định căn chỉnh và 'setfill' cho phép xác định ký tự nào hoàn thành (khoảng trống theo mặc định). –

8

Trình điều khiển IO là những gì bạn cần. setw, đặc biệt. Dưới đây là một ví dụ từ trang tài liệu tham khảo:

// setw example 
#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() { 
    cout << setw (10); 
    cout << 77 << endl; 
    return 0; 
} 

Luận chứng các lĩnh vực sang bên trái và bên phải được thực hiện với sự leftright thao tác.

Ngoài ra, hãy xem setfill. Dưới đây là hướng dẫn đầy đủ hơn về formatting C++ output with io manipulators.

4

Đồng thời bạn phát ra dòng đầu tiên,

Artist Title Price Genre Disc Sale Tax Cash 

để đạt được "sắp xếp", bạn phải biết "trước" làm thế nào rộng mỗi cột sẽ cần phải được (nếu không, sự liên kết là không thể) . Khi bạn làm biết chiều rộng cần thiết cho mỗi cột (có một số cách có thể để đạt được điều đó tùy thuộc vào nơi dữ liệu của bạn đến), sau đó chức năng setw được đề cập trong câu trả lời khác sẽ giúp hoặc (nhiều hơn); có thể phát ra số lượng không gian được tính toán cẩn thận (chắc chắn, chắc chắn), v.v. Tôi không đề xuất các tab vì bạn không có quyền kiểm soát thực tế về cách thiết bị đầu ra cuối cùng sẽ hiển thị các tab đó, nói chung.

Quay lại vấn đề cốt lõi, nếu bạn có giá trị của mỗi cột trong một số vector<T> của một số loại, ví dụ, bạn có thể thực hiện định dạng đầu tiên để xác định chiều rộng tối đa của cột, ví dụ tài khoản chiều rộng của tiêu đề cho cột, quá, tất nhiên).

Nếu hàng của bạn đến "từng người một" và căn chỉnh là rất quan trọng, bạn sẽ phải lưu bộ nhớ cache hoặc đệm các hàng khi chúng đến (trong bộ nhớ nếu chúng phù hợp, nếu không trên một tệp đĩa mà bạn sẽ sau đó "tua lại" và đọc lại từ đầu), cẩn thận cập nhật vectơ "chiều rộng tối đa của mỗi cột" khi các hàng đến. Bạn không thể xuất ra bất kỳ thứ gì (thậm chí không phải là tiêu đề!), Nếu giữ liên kết là rất quan trọng, cho đến khi bạn thấy hàng cuối cùng (trừ khi bạn bằng cách nào đó có kiến ​​thức trước về chiều rộng của cột, dĩ nhiên ;-).

112

Cách tiêu chuẩn ISO C++ để thực hiện là #include <iomanip> và sử dụng các thao tác io như std::setw. Tuy nhiên, điều đó nói rằng, những người thao túng io là một nỗi đau thực sự để sử dụng ngay cả đối với văn bản và không thể sử dụng để định dạng số (tôi giả sử bạn muốn số tiền đô la của bạn xếp hàng theo số thập phân, có số chữ số chính xác, v.v. .). Ngay cả đối với nhãn văn bản chỉ đơn giản, mã sẽ giống như thế này cho phần đầu của dòng đầu tiên của bạn:

// using standard iomanip facilities 
cout << setw(20) << "Artist" 
    << setw(20) << "Title" 
    << setw(8) << "Price"; 
// ... not going to try to write the numeric formatting... 

Nếu bạn có thể sử dụng Boost libraries, chạy (đừng đi) và sử dụng Thay vào đó, thư viện Boost.Format. Nó hoàn toàn tương thích với các iostream tiêu chuẩn, và nó mang lại cho bạn tất cả sự tốt lành để định dạng dễ dàng với chuỗi định dạng printf/Posix, nhưng không mất đi bất kỳ quyền lực và sự tiện lợi nào của bản thân iostream.Ví dụ, các bộ phận đầu tiên của hai dòng đầu tiên của bạn sẽ giống như thế:

// using Boost.Format 
cout << format("%-20s %-20s %-8s\n") % "Artist" % "Title" % "Price"; 
cout << format("%-20s %-20s %8.2f\n") % "Merle" % "Blue" % 12.99; 
+5

Boost.Format là thực sự tốt đẹp :) –

+2

'Boost.Format' sẽ rất tốt. Định dạng kiểu «printf' đơn giản với kiểu an toàn. – dreamlax

+4

Định dạng vị trí quá, điều này thật tuyệt vì nó có nghĩa là bạn có thể kéo chúng từ một tệp bản địa hóa. –

9

Xem thêm: Which C I/O library should be used in C++ code?

struct Item 
{ 
    std::string  artist; 
    std::string  c; 
    integer   price; // in cents (as floating point is not acurate) 
    std::string  Genre; 
    integer   disc; 
    integer   sale; 
    integer   tax; 
}; 

std::cout << "Sales Report for September 15, 2010\n" 
      << "Artist Title Price Genre Disc Sale Tax Cash\n"; 
FOREACH(Item loop,data) 
{ 
    fprintf(stdout,"%8s%8s%8.2f%7s%1s%8.2f%8.2f\n", 
      , loop.artist 
      , loop.title 
      , loop.price/100.0 
      , loop.Genre 
      , loop.disc , "%" 
      , loop.sale/100.0 
      , loop.tax/100.0); 

    // or 

    std::cout << std::setw(8) << loop.artist 
       << std::setw(8) << loop.title 
       << std::setw(8) << fixed << setprecision(2) << loop.price/100.0 
       << std::setw(8) << loop.Genre 
       << std::setw(7) << loop.disc << std::setw(1) << "%" 
       << std::setw(8) << fixed << setprecision(2) << loop.sale/100.0 
       << std::setw(8) << fixed << setprecision(2) << loop.tax/100.0 
       << "\n"; 

    // or 

    std::cout << boost::format("%8s%8s%8.2f%7s%1s%8.2f%8.2f\n") 
       % loop.artist 
       % loop.title 
       % loop.price/100.0 
       % loop.Genre 
       % loop.disc % "%" 
       % loop.sale/100.0 
       % loop.tax/100.0; 
} 
5

Một cách khác để làm cho cột thẳng hàng như sau:

using namespace std; 

cout.width(20); cout << left << "Artist"; 
cout.width(20); cout << left << "Title"; 
cout.width(10); cout << left << "Price"; 
... 
cout.width(20); cout << left << artist; 
cout.width(20); cout << left << title; 
cout.width(10); cout << left << price; 

Chúng ta nên ước tính độ dài tối đa của các giá trị cho mỗi cột. Trong trường hợp này, giá trị của cột "Nghệ sĩ" không được vượt quá 20 ký tự, v.v.

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