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::ostream | std::basic_ostream<char> |
std::wostream | std::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;
}