首頁 >後端開發 >C++ >為什麼某些 C 語言操縱器表現出「黏性」行為?

為什麼某些 C 語言操縱器表現出「黏性」行為?

Patricia Arquette
Patricia Arquette原創
2024-12-25 19:32:10778瀏覽

Why Do Some C   Iomanipulators Exhibit

C 中的操縱器及其「黏性」性質

在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() 不是一個「黏性」操縱器,這意味著它只會影響下一個插入操作。

哪些操縱器是黏性的?

根據評論中的討論,以下內容機械手分類為'粘性':

  • setiosflags
  • resetiosflags
  • setbase
  • resetiosflags< >setfill
  • set precision
這些操縱器都傳回一個物件而不是流,表示它們僅對要插入流中的下一個物件執行操作。

非黏性操縱器

    [no]boolalpha
  • [no]showbase
  • [no]showpoint
  • [ no]showpos
  • [沒有]skipws
  • [沒有]unitbuf
  • [無]大寫
  • 十進位/十六進位/八進位
  • 固定/科學
  • 內部/左/右
  • ws/endl /結束/沖洗

這些操縱器對流本身執行操作,而不影響其後續操作的狀態。

例外: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn