C++ 流精通:cout、cin、cerr、clog 实战指南
C++ 中的流是什么?
C++ 通过一族流类抽象输入输出,以字节序列形式传输数据。流是语言中所有 I/O 操作的基石。
流分两类:
流的类型
- 输入流 – 从键盘、文件等设备接收数据并置入内存。
- 输出流 – 从内存向显示器、文件等设备发送数据。
本教程涵盖:
- 流基础
- 流的底层工作原理
- 关键流类及其功能
- C++ I/O 头文件
- 使用 std::cout、std::cin、std::cerr、std::clog
- 流对象的错误处理
流如何工作
典型 C++ 流操作流程:
- 实例化适当类型的流对象。
- 通过 get/put 指针将流与设备或文件关联。
- 通过提取(>>)或插入(<<)运算符执行 I/O。
流类概览
streambuf 头文件提供多个管理文件缓冲区的类:
| 类 | 说明 |
|---|---|
| filebuf | 管理文件读写缓冲区,提供 open() 和 close()。 |
| fstreambase | ifstream、fstream、ofstream 的基类 – 通用文件流操作。 |
| ifstream | 输入文件流,用于读取数据。 |
| ofstream | 输出文件流,用于写入数据。 |
| fstream | 组合输入输出流。 |
C++ I/O 头文件
- iostream – 提供
cin、cout、cerr、clog。 - iomanip – 提供
setw、setprecision等操纵符。 - fstream – 处理基于文件的流。
所有这些对象定义在 iostream 中;省略该头文件会导致编译错误。
std::cout
cout 对象写入标准输出流(通常是控制台),配合插入运算符(<<)使用。
示例
#include <iostream> using namespace std; int main() { char welcome[] = "Welcome to Guru99"; cout << welcome << endl; return 0; }
输出:

代码走读:
- 包含
iostream访问cout。 - 使用
std命名空间避免前缀。 - 定义字符数组存消息。
- 用
endl打印消息并换行。 - 返回
0表示成功。
std::cin
cin 对象从标准输入流(通常是键盘)读取,配合提取运算符(>>)使用。
示例
#include <iostream> using namespace std; int main() { int number; cout << "Enter a number:"; cin >> number; cout << "\nYou entered: " << number; return 0; }
输出:

代码解释:
- 包含
iostream获取cin和cout。 - 使用
std命名空间。 - 声明整型变量。
- 提示用户。
- 用
>>读取输入。 - 回显输入值。
- 成功返回
0。
std::cerr
cerr 流输出错误消息且无缓冲,即时显示。用于必须立即呈现的严重错误。
示例
#include <iostream> using namespace std; int main() { cerr << "An Error occurred!"; return 0; }
输出:

解释:
- 包含
iostream获取cerr。 - 使用
std命名空间。 - 立即打印错误消息。
- 返回
0。
std::clog
与 cerr 不同,clog 是有缓冲的,消息存入缓冲区待刷新再输出。适合可延迟的日志记录。
示例
#include <iostream> using namespace std; int main() { clog << "An Error occurred!"; return 0; }
输出:

解释:
- 包含
iostream获取clog。 - 使用
std命名空间。 - 写入缓冲错误消息。
- 返回
0。
流对象的错误处理
流可在布尔上下文中求值以检查有效性。成员函数提供细粒度状态检查:
good()– 无错误时为 true。bad()– 发生致命错误为 true。fail()– 操作失败后为 true。eof()– 到达流末尾为 true。
示例 – 验证文件打开:
ifstream file("myfile.txt"); if (!file) { cout << "File NOT opened!" << endl; }
示例 – 验证用户输入:
int p; if (cin >> p) { cout << "Enter valid number" << endl; }
总结
- C++ 通过流传输字节序列进行 I/O。
- 输入流将数据从设备移至内存;输出流将数据从内存移至设备。
cin(istream) 读取键盘输入。cout(ostream) 写入控制台。cerr(ostream) 即时显示错误消息。clog(ostream) 缓冲错误输出供后续刷新。- 缓冲流可用
good()、bad()、fail()、eof()检查状态。
C语言
- C# 基础:输入输出核心技巧完全指南
- 掌握 C++ 输入输出:cin/cou 完整实战指南
- C 语言输入输出(I/O)精通:scanf() 与 printf() 详解
- 掌握 C++ switch-case:语法、用法与实战示例
- C++ 异常处理实战:try、catch、throw 完整指南与示例
- C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
- C++ 结构体详解:定义、初始化、指针、函数参数与局限性
- C 语言输入输出完全掌握:标准 I/O 与格式化控制
- C++核心语法与面向对象基石深度解析
- C++文件I/O完全指南:fstream读写、打开模式、定位指针与完整实例
- 掌握 D 锁存器:设计、工作原理与关键差异
- 精通 Java 输入输出:打印、读取与格式化数据