在C 中,某些iomanip 操縱器表現出一種稱為「黏性」的行為,它們會繼續影響流,直到明確重置。此行為可能會導致意外結果,如下列程式碼片段所示:
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() 操縱器將 tm_mday 欄位格式化為寬度 2 並右對齊輸出。但是,tm_hour 和 tm_min 會在沒有任何格式的情況下列印。這是因為 setw() 不是一個「黏性」操縱器,這意味著它只會影響下一個插入操作。
根據評論中的討論,以下內容機械手分類為'粘性':
這些操縱器對流本身執行操作,而不影響其後續操作的狀態。
值得注意的是,setw() 是唯一一個在流上表現不同的操縱器作者的系統。雖然它不是一個「黏性」操縱器,但可以使其表現得像使用自訂格式物件的操縱器,如以下程式碼所示:
#include <iostream> #include <iomanip> struct SquareBracktAroundNextItem { SquareBracktAroundNextItem(std::ostream& str) : m_str(str) {} std::ostream& m_str; }; struct PutSquareBracket {}; SquareBracktAroundNextItem operator<<(std::ostream& str, PutSquareBracket const& data) { return SquareBracktAroundNextItem(str); } 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 }
輸出:
5.34 [5.3400000000] 5.34
總之,C 中的大多數iomanip 操縱器都是“粘性的”,這意味著它們會繼續影響流,直到明確重置為止。 setw() 是一個值得注意的例外,但可以使用自訂格式物件將其設為「黏性」。
以上是為什麼某些 C 語言操縱器表現出「黏性」行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!