2015-05-16 17 views
6

W programie C++ mam kod do wypisania obiektu klasy o nazwie ułamek. Jego zmienne to n (licznik), d (mianownik) i sinal (sygnał: prawda, gdy ułamek jest dodatni, a fałszywy w innym przypadku).iomanip z obiektem klasy

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

Robi dobrą robotę, ale gdy próbuję użyć setw() w tym, że nie działa prawidłowo: to właśnie wpływa na pierwszą pozycję, która zostanie wydrukowana (czy to sygnał lub licznik).

Próbowałem to zmienić i roztwór znalazłem najpierw przekonwertować go na ciąg znaków, a następnie za pomocą os z 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; 
} 

To działa, ale oczywiście nie jestem w stanie zmienić szerokość, jaką będzie miała frakcja: dla wszystkich będzie 7. Czy istnieje sposób, aby to zmienić? Naprawdę potrzebuję różnych szerokości dla różnych frakcji. Z góry dziękuję.

Odpowiedz

1

To dlatego, że zgodnie z https://stackoverflow.com/a/1533752, width wyjścia jest jawnie resetowane dla każdego sformatowanego wyjścia.

Co można zrobić, to na początku funkcji uzyskać bieżącą szerokość, która jest ustawiona przez szerokość std::setw (lub pokrewną), a następnie ustawić tę szerokość jawnie dla każdej wartości, gdzie ma być zastosowana i użyć std::setw(0) dla każda wartość, którą chcesz wyjścia jak jest:

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

teraz trzeba poprawić na to nieco obsłużyć lewy i prawy dopełnienie; to obsługuje tylko lewe dopełnianie.

+0

To jest niesamowite! Dziękuję Ci bardzo. – ahgert

Powiązane problemy