2015-05-16 23 views
6

Trong chương trình C++, tôi có một số mã để in một đối tượng của một lớp được gọi là phân số. Các biến của nó là n (tử số), d (mẫu số) và sinal (tín hiệu: true khi một phân số dương và sai).iomanip với đối tượng của một lớp

ostream &operator << (ostream &os, const fraction &x){//n=0 

    if(!x.sinal) 
     os << "-"; 

    os << x.n; 

    if(x.d!=1 && x.n!=0) 
     os << "/" << x.d; 

    return os; 
} 

Nó làm một công việc tốt, nhưng khi tôi cố gắng sử dụng một setw() trong nó, nó không hoạt động đúng cách: nó chỉ ảnh hưởng đến mục đầu tiên được in (cho dù đó là những tín hiệu hoặc tử số).

tôi đã cố gắng để thay đổi nó và giải pháp tôi tìm thấy là người đầu tiên chuyển đổi nó thành một chuỗi và sau đó sử dụng os với một iomanip:

ostream &operator << (ostream &os, const fraction &x){//n=0 

    string xd, xn; 

    stringstream ssn; 
    ssn << x.n; 
    ssn >> xn; 

    stringstream ssd; 
    ssd << x.d; 
    ssd >> xd; 

    string sfra = ""; 

    if(!x.sinal) 
     sfra += "-"; 

    sfra += xn; 

    if(x.d !=1 && x.n != 0){ 
     sfra += "/"; 
     sfra += xd; 
    } 

    os << setw (7) << left << sfra; 

    return os; 
} 

này hoạt động, nhưng rõ ràng là tôi không thể thay đổi chiều rộng mà một phần sẽ có: nó sẽ là 7 cho tất cả chúng. Có cách nào để thay đổi điều đó không? Tôi thực sự cần phải sử dụng độ rộng khác nhau cho các phân số khác nhau. Cảm ơn trước.

Trả lời

1

Đó là vì, theo https://stackoverflow.com/a/1533752, width của đầu ra được đặt lại rõ ràng cho mỗi đầu ra được định dạng.

Điều bạn có thể làm lúc bắt đầu hàm của bạn là chiều rộng hiện tại, chiều rộng được đặt bằng std::setw (hoặc có liên quan), sau đó đặt độ rộng này một cách rõ ràng cho từng giá trị mà bạn muốn áp dụng và sử dụng std::setw(0) cho mỗi giá trị mà bạn muốn xuất dưới dạng là:

ostream &operator << (ostream &os, const fraction &x) 
{ 
    std::streamsize width = os.width(); 

    if(!x.sinal) 
     os << std::setw(width) << "-"; 
    else 
     os << std::setw(width); // Not necessary, but for explicitness. 

    os << x.n; 

    if(x.d!=1 && x.n!=0) 
     os << "/" << std::setw(width) << x.d; 

    return os; 
} 

Bây giờ bạn cần phải cải thiện khi xử lý một chút để xử lý đệm trái và phải; điều này chỉ xử lý phần đệm trái.

+0

Điều này thật tuyệt vời! Cảm ơn nhiều. – ahgert

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