首页 > 后端开发 > C++ > 为什么某些 C 语言操纵器表现出'粘性”行为?

为什么某些 C 语言操纵器表现出'粘性”行为?

Patricia Arquette
发布: 2024-12-25 19:32:10
原创
756 人浏览过

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
  • 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板