【STL】iostream 编程:字符串和 I/O 格式化

📅 2026/6/27 16:48:14
【STL】iostream 编程:字符串和 I/O 格式化
本文介绍一下 iostream 编程中的字符串和 I/O 格式化并给出两个示例便于理解。目录1 概述2 示例3 其他格式化方案4 综述1 概述C 的 iostream 库提供类、函数与运算符来实现格式化字符串输入输出。2 示例以下代码演示如何设置 cout 以将整数格式化为十六进制中的输出。#includeiostream#includeiomanipusingnamespacestd;intmain(){iosstate(nullptr);coutThe answer in decimal is: 42endl;state.copyfmt(cout);// save current formattingcoutIn hex: 0x// now load up a bunch of formatting modifiershexuppercasesetw(8)setfill(0)42// the actual value we wanted to print outendl;cout.copyfmt(state);// restore previous formatting}运行结果cout 的格式标记会一直生效不会只作用于单行代码。因此在切换进制、对齐、填充字符之前必须先保存流状态使用完毕再恢复原状。这种流操纵方式类型安全、扩展性强但是代码冗长繁琐。3 其他格式化方案方案一使用第三方库 Boost.Format不属于 C标准Boost.Format 的优点安全类型严格校验参数数量不匹配时直接抛出异常可扩展支持所有能够流式输出的自定义类型简洁兼容 POSIX 风格的格式化字符串Boost.Format 底层仍然基于 iostream 实现安全灵活但没有做极致性能优化。2. 方案二追求极致性能时可以选用 C语言的 printf、sprintf。它们执行速度快、写法简洁缺点是不支持自定义类型并且存在缓冲区溢出漏洞微软提供了安全版本 sprintf_s安全性更高只略微损失一点性能4 综述std::cout 格式化痛点格式全局持久有效每次修改都要保存 恢复现场样板代码太多三类方案取舍iostream安全、支持自定义类型写法啰嗦Boost.Format语法简洁、带类型安全校验非标准、性能一般C printf速度最快不安全不支持 C 对象现代 C 新标准解决方案C20 正式引入 std::format兼顾语法简洁、类型安全、高性能是对以上几种方案的整合优化