SORU
7 EKİM 2009, ÇARŞAMBA


İomanip manipülatörler 'nemli olan'?

Geçenlerde bir sorun stringstream ben yanlış kabul std olması nedeniyle oluşturuyordu::setw() açıkça değiştirdim kadar her ekleme için stringstream etkiler. Ancak, her zaman ekleme sonra geri al.

// With timestruct with value of 'Oct 7 9:04 AM'
std::stringstream ss;
ss.fill('0'); ss.setf(ios::right, ios::adjustfield);
ss << setw(2) << timestruct.tm_mday;
ss << timestruct.tm_hour;
ss << timestruct.tm_min;
std::string filingTime = ss.str(); // BAD: '0794'

Bu yüzden, bir dizi soru var:

  • Neden setw() bu şekilde?
  • Diğer manipülatörler böyle?
  • Orada std davranış arasında bir fark var::ios_base::genişlik() ve std::setw()?
  • Sonunda orada açıkça bu davranış belgeleri online başvuru? Satıcı benim belgeler (Visual Studio 2005 MS) açıkça göstermiyor.

CEVAP
7 EKİM 2009, ÇARŞAMBA


Aşağıdaki yorum önemli notlar:

Martin:

@Chareles: tüm manipülatörler yapışkan bu şartı ile. Reset gibi görünüyor setw kullanım sonrası hariç.

Charles:

Kesinlikle! ve bu setw farklı davranır görünür tek nedeni açıkça biçimlendirilmiş çıkış işlemleri gereksinimleri vardır çünkü .(0) çıkış akışı genişliği.

Aşağıdaki yukarıdaki sonuç çıkıyor tartışma


Koda bakarak aşağıdaki manipülatörler bir akış yerine: bir nesne döndürür

setiosflags
resetiosflags
setbase
setfill
setprecision
setw

Bu akış uygulanan sadece bir sonraki nesneye bir işlem uygulamak için yaygın bir tekniktir. Ne yazık ki bu yapışkan olmalarını engellemez. Testleri setw hariç hepsi yapışkan olduğunu gösteriyor.

setiosflags:  Sticky
resetiosflags:Sticky
setbase:      Sticky
setfill:      Sticky
setprecision: Sticky

Diğer tüm manipülatörler dönüş bir akış nesnesi. Böylece onlar değiştirmek her devlet, bilgi akışı nesnesi olarak kayıtlı olmalı ve böylece kalıcı bir manipülatör durumu değişene kadar). Böylece aşağıdaki manipülatörler olmalıdırYapışkanmanipülatörler.

[no]boolalpha
[no]showbase
[no]showpoint
[no]showpos
[no]skipws
[no]unitbuf
[no]uppercase

dec/ hex/ oct

fixed/ scientific

internal/ left/ right

Bu manipülatörler aslında kendi akımı yerine akış nesnesi üzerinde bir işlem akış akış nesneleri devletin bir parçası olmasına Rağmen teknik olarak () gerçekleştirin. Ama akış nesneleri devletin diğer kısımları etkiler inanmıyorum.

ws/ endl/ ends/ flush

Sonuç setw yapışkan değil benim sürüm tek manipülatör gibi görünüyor.

Charles için basit bir hile zincirinde sadece bir sonraki maddeyi etkiler:
Burada bir nesne temporaily için nasıl kullanılabileceğini bir Örnek durumu daha sonra bir nesne kullanarak: geri koy değiştirin

#include <iostream>
#include <iomanip>

// Private object constructed by the format object PutSquareBracket
struct SquareBracktAroundNextItem
{
    SquareBracktAroundNextItem(std::ostream& str)
        :m_str(str)
    {}
    std::ostream& m_str;
};

// New Format Object
struct PutSquareBracket
{};

// Format object passed to stream.
// All it does is return an object that can maintain state away from the
// stream object (so that it is not STICKY)
SquareBracktAroundNextItem operator<<(std::ostream& str,PutSquareBracket const& data)
{
    return SquareBracktAroundNextItem(str);
}

// The Non Sticky formatting.
// Here we temporariy set formating to fixed with a precision of 10.
// After the next value is printed we return the stream to the original state
// Then return the stream for normal processing.
template<typename T>
std::ostream& operator<<(SquareBracktAroundNextItem const& bracket,T const& data)
{
    std::ios_base::fmtflags flags               = bracket.m_str.flags();
    std::streamsize         currentPrecision    = bracket.m_str.precision();

    bracket.m_str << '[' << std::fixed << std::setprecision(10) << data << std::setprecision(currentPrecision) << ']';

    bracket.m_str.flags(flags);

    return bracket.m_str;
}


int main()
{

    std::cout << 5.34 << "\n"                        // Before 
              << PutSquareBracket() << 5.34 << "\n"  // Temp change settings.
              << 5.34 << "\n";                       // After
}


> ./a.out 
5.34
[5.3400000000]
5.34

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • sinumatic

    sinumatic

    19 Aralık 2006