iostream = input + output + stream(输入·输出·流)。它是 C++ 标准库里的一个头文件,作用是告诉编译器"我要用流的方式跟外界打交道",并声明四个现成的对象:cin(键盘 → 程序)、cout(程序 → 屏幕)、cerr(错误,立刻出)、clog(日志,先攒着)。入门阶段只会用到 cin 和 cout,其余两个知道有这么回事就行。
一、名字拆开看,一眼就懂
| 片段 | 全称 | 意思 |
|---|---|---|
| i | input | 输入:数据从外面进程序 |
| o | output | 输出:数据从程序往外出 |
| stream | stream | 流:把数据看成一串"顺流而下"的字节 |
"流"这个字的妙处:你不需要关心数据具体怎么搬——只把数据"扔进水流",它自己会流到目的地。关于流,2.5.2 会专门讲;这一节先记住cout 就是一根通向屏幕的水管。
二、它给你四个现成的对象
#include <iostream>
using namespace std;
int main() {
cout << "这行去屏幕(正常消息)" << endl;
cerr << "这行也去屏幕(错误消息)" << endl;
return 0;
}
| 对象 | 全称 | 方向 | 特点 |
|---|---|---|---|
cin |
character input | 键盘 → 程序 | 配合 >> 使用(2.5) |
cout |
character output | 程序 → 屏幕 | 配合 << 使用,最常用 |
cerr |
character error | 程序 → 屏幕 | 不缓冲,出错时立刻显示(怕程序挂了看不到) |
clog |
character log | 程序 → 屏幕 | 有缓冲,像写日志一样攒一批再输出 |
cout / cin / cerr 开头的 c 都是 character(字符)——流里流的是字符。这是从 C 语言继承来的命名习惯。
三、头文件 ≠ 库本身
这是新手最容易含糊的一点,说清楚:
iostream(头文件) → 只负责"声明":告诉编译器 cout 长什么样、能怎么用
标准库(libstdc++/msvcprt) → 才放"实现":cout 到底怎么把字送到屏幕的代码
所以完整的链路是:#include <iostream>(编译前把声明贴进来)→ 编译(生成 .o,此时 cout 还只是个"说好了但没实现"的符号)→ 链接(把标准库的实现接上)→ 生成 .exe。
接口与实现分家,就是第 1 章"编译+链接两步"的实证。也解释了 1.3.1 那个现象:头文件找不到 → 编译就报错;库没接上 → 链接才报错。
四、和 C 语言的 <stdio.h> 对比
| C 语言 | C++ | |
|---|---|---|
| 头文件 | <stdio.h> |
<iostream> |
| 输出 | printf("%d", n); |
cout << n; |
| 输入 | scanf("%d", &n); |
cin >> n; |
| 类型安全 | 差:格式符 %d 写错,编译器不管 |
好:类型自动识别,不用写格式符 |
| 扩展性 | 只能输出内置类型 | 你自己定义的类型也能用 << 输出(第 8 章之后会看到) |
结论:C++ 用"流"替代 C 的"格式化函数",换来的是少犯错(不用背 %d %f %s)与可扩展。但 C 的 printf 排版控制更顺手,所以教材在实例 04 里也会教它——两把刀都会用,看场合挑。
五、动手 Demo:让 cout 和 cerr 分道扬镳
新建 stream.cpp:
#include <iostream>
using namespace std;
int main() {
cout << "这是正常输出" << endl;
cerr << "这是错误信息" << endl;
return 0;
}
编译运行,屏幕上看不出区别(两行都显示)。真正的区别要这样试:在 Dev-C++ 里先 F11 编译,然后在 PowerShell 里进入工程目录,执行:
cd D:\Dev-Cpp\你的工程目录
.\stream.exe > out.txt 2> err.txt
type out.txt
type err.txt
看到什么算成功:out.txt 里只有"这是正常输出",err.txt 里只有"这是错误信息"——两条流水管果然是分开的。
30 秒实验:把 cerr 那行改成 clog,再用同样方式重定向,结果一样分成两个文件。体会:"显示在屏幕上"不等于"是同一条通道"。
六、常见误区
- "
iostream管所有输入输出"——只管控制台(键盘/屏幕)。文件读写是<fstream>,字符串处理是<sstream>(第 11 章之后) - "写
#include <iostream.h>也一样"——老编译器时代的写法,现代标准库没有.h版本,写了直接报"找不到文件" - "
cerr和clog是多余的"——现在看不出用,等程序变复杂、需要分离"正常消息"和"错误消息"时(比如日志系统、自动化脚本判断程序是否失败),它们就派上用场 - "用
cout输出就万事大吉"——cout默认不换行,要换行得加endl或"\n"(下一节 2.1.3 起会反复出现)
自测三问(点开对答案)
1. `iostream` 三个片段分别什么意思?——i=input 输入,o=output 输出,stream=流(数据的通道)。 2. `cout` 和 `cerr` 有什么区别?——都往屏幕送,但 `cout` 有缓冲(正常消息),`cerr` 不缓冲、出错时立刻显示(错误消息)。 3. 头文件和库分别负责什么?——头文件只**声明**(长什么样),库负责**实现**(真正干活的代码);所以头文件缺失报编译错误,库没接上报链接错误。- ☑ 命名空间
相关笔记
- #include 指令 —— 头文件是怎么"贴"进来的
- C++工程项目文件 —— 编译与链接两步
- C++语言中的流 —— 流的正式讲解