当前位置: 首页 > news >正文

basic_ostream

std::basic_ostream总结

文章目录

  • `std::basic_ostream`总结
    • 概述
      • 常用类型定义
      • 全局输出对象
    • 核心成员函数
      • 1. 格式化输出
      • 2. 非格式化输出
      • 3. 流定位
      • 4. 其他功能
    • 继承的功能
      • 来自 `std::basic_ios`
        • 状态检查
        • 状态管理
      • 来自 `std::ios_base`
        • 格式化标志
        • 流打开模式
    • C++23 新增功能
    • 特点说明
    • 基本用法示例
  • 例子

概述

std::basic_ostream是 C++ 标准库中用于高级字符流输出操作的类模板,定义于 <ostream>头文件中。它提供格式化和非格式化输出功能,构建在 basic_streambuf接口之上。

常用类型定义

类型定义
std::ostreamstd::basic_ostream<char>
std::wostreamstd::basic_ostream<wchar_t>

全局输出对象

对象描述
cout标准 C 输出流 (stdout)
wcout宽字符标准输出流
cerr标准错误流 (stderr),无缓冲
wcerr宽字符标准错误流,无缓冲
clog标准错误流 (stderr)
wclog宽字符标准错误流

核心成员函数

1. 格式化输出

  • ​**operator<<**: 插入格式化数据(各种数据类型)

2. 非格式化输出

函数描述
put插入单个字符
write插入字符块

3. 流定位

函数描述
tellp返回输出位置指示器
seekp设置输出位置指示器

4. 其他功能

  • ​**flush**: 刷新输出缓冲区

  • ​**swap**​ (C++11): 交换流对象(除关联缓冲区外)

继承的功能

来自 std::basic_ios

状态检查
函数描述
good()检查是否无错误
eof()检查是否到达文件末尾
fail()检查是否发生错误
bad()检查是否发生不可恢复错误
operator!错误检查(fail()的同义词)
operator bool无错误检查(!fail()的同义词)
状态管理
  • rdstate(): 返回状态标志

  • setstate(): 设置状态标志

  • clear(): 修改状态标志

来自 std::ios_base

格式化标志
标志描述
dec十进制整数输出
oct八进制整数输出
hex十六进制整数输出
left左对齐输出
right右对齐输出
scientific科学计数法浮点输出
fixed固定点表示法浮点输出
boolalpha布尔值字母格式输出
流打开模式
模式描述
out打开用于写入
app追加模式
binary二进制模式
trunc截断模式
ate打开后定位到文件末尾

C++23 新增功能

函数描述
print()格式化输出
println()格式化输出并追加换行符
vprint_unicode()Unicode 感知输出
vprint_nonunicode()字符数据输出

特点说明

  • 主要用于处理字符流的高级别输出操作

  • 同时支持格式化和非格式化输出

  • 通过虚继承从 std::basic_ios派生

  • 提供 sentry 类用于输出操作前的准备工作

  • 支持各种数据类型的格式化输出

  • 提供完整的流状态管理和错误处理机制

基本用法示例

#include <iostream>
#include <iomanip>int main() {// 基本输出std::cout << "Hello, World!" << std::endl;// 格式化输出std::cout << std::hex << 255 << std::endl;      // 输出 ffstd::cout << std::setprecision(2) << 3.14159;  // 输出 3.14// 非格式化输出std::cout.put('A');std::cout.write("Test", 4);return 0;
}

此总结涵盖了 std::basic_ostream的主要功能和特性,适用于日常使用参考。

例子

#include <iostream>
#include <streambuf>
#include <iomanip>// 自定义streambuf类,用于演示basic_ostream的底层使用
class CustomStreambuf : public std::streambuf {
protected:virtual int_type overflow(int_type c) override {if (c != traits_type::eof()) {// 这里简单地将输出打印到控制台std::putchar(c);}return c;}virtual std::streamsize xsputn(const char* s, std::streamsize count) override {// 输出字符序列for (std::streamsize i = 0; i < count; ++i) {std::putchar(s[i]);}return count;}
};int main() {// 1. 创建自定义streambufCustomStreambuf myStreambuf;// 2. 直接创建basic_ostream对象std::basic_ostream<char> os(&myStreambuf);// 3. 基本格式化输出os << "=== 基本格式化输出 ===" << std::endl;os << "整数: " << 42 << std::endl;os << "浮点数: " << 3.14159 << std::endl;os << "布尔值: " << true << std::endl;// 4. 高级格式化控制os << "\n=== 高级格式化控制 ===" << std::endl;os << "十六进制: " << std::hex << 255 << std::endl;os << "八进制: " << std::oct << 64 << std::endl;os << "十进制: " << std::dec << 100 << std::endl;os << "固定2位小数: " << std::fixed << std::setprecision(2) << 3.141592653589793 << std::endl;os << "科学计数法: " << std::scientific << 123456789.0 << std::endl;os << "宽度10右对齐: |" << std::setw(10) << 123 << "|" << std::endl;os << "宽度10左对齐: |" << std::left << std::setw(10) << 123 << "|" << std::endl;os << "宽度10填充*: |" << std::setfill('*') << std::setw(10) << 123 << "|" << std::endl;// 5. 非格式化输出os << "\n=== 非格式化输出 ===" << std::endl;os.put('A').put('\n');const char* msg = "Hello, pure basic_ostream!";os.write(msg, 12).put('\n');  // 只输出前12个字符// 6. 流状态检查os << "\n=== 流状态检查 ===" << std::endl;if (os.good()) {os << "流状态良好" << std::endl;}// 7. 刷新缓冲区os << "\n=== 刷新缓冲区 ===" << std::endl;os << "立即刷新..." << std::flush;os << " 完成!" << std::endl;return 0;
}
http://www.xdnf.cn/news/1403371.html

相关文章:

  • Linux网络基础1(三)之网络与协议栈and网络传输基本流程
  • Yolov8损失函数:回顾Yolov8-Loss
  • 6.1 Update不能写复杂的逻辑
  • HarmonyOS Router 基本使用详解:从代码示例到实战要点
  • 【随笔】【Debian】【ArchLinux】基于Debian和ArchLinux的ISO镜像和虚拟机VM的系统镜像获取安装
  • 4-ATSAM3X8E-FLASH写入
  • Docker(自写)
  • MEM课程之物流与供应链管理课程经典案例及分析-个人原创内容放在此保存
  • 数据结构(C语言篇):(七)双向链表
  • 三重积分从入门到入土
  • 【C++】string
  • Selenium 实战项目:电子商务网站自动化测试
  • Dify的搭建
  • MinerU本地化部署
  • 如何使用 DeepSeek 帮助自己的工作?—— 从效率工具到能力延伸的实战指南
  • kind集群应用
  • 【从零开始java学习|第十篇】面向对象
  • 【前端教程】MIUI 官网界面设计与实现全解析
  • 函数(2)
  • 机器学习中KNN算法介绍
  • static静态文件和requests请求对象
  • 前端浏览器调试
  • 函数(1)
  • 3.kafka常用命令
  • 【CMake】静态库(编译-链接-安装)完整示例
  • AI工具营销落地方案:工业产品营销
  • 编程与数学 03-004 数据库系统概论 08_逻辑结构设计
  • 【Canvas与盾牌】美国队长之盾卡通版
  • java报错问题解析
  • Dify 从入门到精通(第 65/100 篇):Dify 的自动化测试(进阶篇)