亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哪個自吹自擂的操縱者是“粘性”的?

哪個自吹自擂的操縱者是“粘性”的?

C++
翻閱古今 2019-07-27 15:15:48
哪個自吹自擂的操縱者是“粘性”的?最近我在創建一個stringstream因為我錯誤地假設std::setw()會影響每個插入的字符串流,直到我顯式地更改它。但是,它總是在插入之后被取消設置。// 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'所以,我有幾個問題:為什么setw()這邊請?還有其他操縱者這樣嗎?在行為上有什么區別嗎?std::ios_base::width()和std::setw()?最后,是否有一個在線參考可以清楚地記錄這種行為?我的供應商文檔(MSVisualStudio 2005)似乎沒有清楚地顯示這一點。
查看完整描述

3 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

以下評論的重要說明:

馬?。?/trans>

@Chareles:那么根據這個要求,所有的機械手都是粘性的。除了SET,它似乎在使用后被重置。

查爾斯:

一點兒沒錯!而setw似乎行為不同的唯一原因是,格式化的輸出操作需要顯式地.Width(0)輸出流。

以下是導致上述結論的討論:


查看代碼,以下操作程序返回一個對象,而不是流:

setiosflags
resetiosflags
setbase
setfill
setprecision
setw

這是一種將操作應用于僅應用于流的下一個對象的常見技術。不幸的是,這并不能阻止他們粘在一起。測試表明,除了setw粘粘的。

setiosflags:  Stickyresetiosflags:Stickysetbase:      Stickysetfill:      Stickysetprecision: Sticky

所有其他操作器都返回流對象。因此,它們更改的任何狀態信息都必須記錄在流對象中,因此是永久的(直到另一個機械手改變狀態)。因此,下列機械手必須是操縱者。

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

dec/ hex/ oct

fixed/ scientific

internal/ left/ right

這些操縱器實際上對流本身執行操作,而不是對流對象執行操作(盡管從技術上講,流是流對象狀態的一部分)。但我不認為它們會影響流對象狀態的任何其他部分。

ws/ endl/ ends/ flush

結論是,在我的版本中,setw似乎是唯一不粘的操縱者。

對查爾斯來說,一個簡單的技巧就是只影響鏈中的下一個項目:
下面是一個示例,說明如何使用對象臨時更改狀態,然后通過使用對象將其放回原處:

#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




查看完整回答
反對 回復 2019-07-28
  • 3 回答
  • 0 關注
  • 374 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號