📄 一句话概括
控制台(console)就是那个黑窗口——程序在这里读键盘、写屏幕。它同时管着三条通道:标准输入 cin(键盘)、标准输出 cout(屏幕)、标准错误 cerr(屏幕,但单独一条线)。三条通道分开不是摆设:正常消息和错误消息可以被分别收集(重定向到不同文件)。入门阶段学的都是控制台程序——它简单、把注意力留给逻辑。
一、控制台是什么
┌────────────────────────────┐
│ C:\Dev-Cpp\hello.exe │ ← 标题栏:当前跑的程序
├────────────────────────────┤
│ 请输入两个整数: │ ← 程序的输出(cout)
│ 7 3 │ ← 你敲的输入(cin)
│ 和 = 10 │ ← 输出
│ █ │ ← 光标:等着你敲下一个
└────────────────────────────┘
"黑窗口"从哪儿来:Windows 的 cmd / PowerShell,以及 Dev-C++ 按 F9 时弹出的那个窗口——它们都是控制台。
| 程序类型 | 长什么样 | 例子 |
|---|---|---|
| 控制台程序 | 黑窗口,靠文字交互 | 你写的 C++ 小程序、ping、dir |
| 窗口程序(GUI) | 有按钮、菜单、图片 | 记事本、浏览器、AutoCAD |
为什么入门先学控制台:不用管按钮、窗口、鼠标——能把全部注意力放在"数据怎么进来、结果怎么出去"。等逻辑和类型都熟了,再去学图形界面(那是另一个大领域)。
二、三条通道各管什么
| 通道 | 对象 | 方向 | 用途 |
|---|---|---|---|
| 标准输入 | cin |
键盘 → 程序 | 读用户输入 |
| 标准输出 | cout |
程序 → 屏幕 | 正常结果 |
| 标准错误 | cerr |
程序 → 屏幕 | 错误消息(不缓冲) |
| 标准日志 | clog |
程序 → 屏幕 | 日志(缓冲) |
为什么把"错误"单列一条:因为使用者需要区分——
- 屏幕上两行字,一行是"转账成功",一行是"余额不足"——混在一起看不出程序整体是成是败
- 分开以后,自动化脚本可以只收错误(
2> err.txt),只把正常输出存进结果文件(> out.txt)
三、重定向:把输出接到别处
控制台程序的输出默认去屏幕,但你可以"改道":
.\io.exe > out.txt # 正常输出写进 out.txt(屏幕上就看不到了)
.\io.exe 2> err.txt # 只把错误输出写进 err.txt
.\io.exe > all.txt 2>&1 # 两条都写进 all.txt
.\io.exe >> out.txt # 追加,不覆盖
echo 7 3 | .\io.exe # 用管道喂输入,全自动
这不是 C++ 的特性,而是所有控制台程序的通用机制——你的程序不需要为它写任何代码。
什么时候真用得上:批量跑程序、把结果存下来做对比、写自动化脚本(服务器课里的"任务计划看运行结果"就是这套思路)。
四、动手 Demo:把输出接进文件
- 用 2.5 写的
io.cpp,F11编译(注意别按 F9,我们要用命令行) - 打开 PowerShell,进入工程目录:
cd D:\Dev-Cpp\你的工程目录
echo 7 3 | .\io.exe > result.txt
type result.txt
看到什么算成功:type 出来的内容就是你程序的完整输出(含提示语与三个结果)——一行都没显示在屏幕上,全进文件了。
30 秒实验:把 echo 7 3 | 去掉,直接 .\io.exe > result.txt,会发现程序卡住不动——因为它在等键盘输入,而输出已经被接到文件里了。按 Ctrl+C 结束它。这个实验说明:输入输出都是可以"改道"的,程序本身完全无感。
五、常见误区
- "Dev-C++ 里 F9 弹出的窗口就是程序本身"——那只是承载程序的容器。程序是
.exe,控制台是它的"外衣" - "重定向后屏幕上什么都没有,是不是程序坏了"——是正常的。输出去文件了,屏幕上自然看不到
- "中文输出乱码是 C++ 的 bug"——是编码不一致:源文件是 UTF-8,控制台默认用的是本地编码(中文 Windows 上常见 GBK)。统一编码(或
chcp 65001切到 UTF-8)就好 - "控制台程序太简陋、不实用"——大量真实工具都是控制台程序(编译器、Git、服务器上的运维脚本、构建工具)。它是最"能干活"的形态
自测三问(点开对答案)
1. 控制台的三条通道分别是什么?——标准输入 `cin`、标准输出 `cout`、标准错误 `cerr`(外加日志 `clog`)。 2. 怎么把程序的输出存进文件?——用重定向:`.\程序.exe > out.txt`;错误单独存用 `2> err.txt`。 3. 中文在控制台乱码,最可能的原因?——**编码不一致**(源文件/控制台用了不同的字符编码)。- ☑ C++语言中的流
相关笔记
- 数据的输入与输出 —— I/O 总览
- iostream 标准库 ——
cout与cerr的区别 - 性能与更新 —— 服务器那门课里"看运行结果",用的就是退出码与输出重定向