为什么某些 C 语言操纵器表现出'粘性”行为?
Dec 25, 2024 pm 07:32 PMC 中的操纵器及其“粘性”性质
在 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中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
两个点博物馆:邦格荒地地点指南
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
两个点博物馆:邦格荒地地点指南
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)