0Pricing
C++ Academy · 课时

使用 std::cerr 和 std::clog

使用 cerr 和 clog 流将诊断信息与日志和程序输出分开

使用 std::cerr 和 std::clog 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

三个输出流

标准库提供了三个预定义的输出流:

  • std::cout —— 带缓冲的标准输出
  • std::cerr —— 无缓冲的标准错误输出
  • std::clog —— 带缓冲的标准错误输出

std::cerr:错误和警告

std::cerr 会写入 stderr,并且是无缓冲的——即使程序紧接着崩溃,输出也会立即显示。

std::cerr << "Error: file not found\n";

std::clog:带缓冲的日志

std::clog 同样会写入 stderr,但像 cout 一样是带缓冲的。对于允许有轻微延迟的常规日志,请使用它。

std::clog << "[info] processing record 42\n";

为什么要将两个流写入 stderr?

错误需要立即显示,这样用户才能在程序崩溃前看到它们。日志的数量通常很大——对日志进行缓冲可以让性能保持在可接受的水平。

重定向输出

在命令行中,stdout 和 stderr 会进入独立的通道。请分别重定向它们。

# Send stdout to a file, stderr to the terminal
./app > out.txt

# Send stderr to a file too
./app 2> err.txt

# Send both to one file
./app > all.txt 2>&1

诊断输出与数据输出

按照惯例,机器可读的数据写入 stdout;面向人的诊断信息写入 stderr。这样可以让管道正常工作。

关联流

cin 默认与 cout 绑定——从 cin 读取内容前会先刷新 cout。cerr 同样与 cout 绑定。

使用级别进行自定义日志记录

将 clog 封装在辅助函数中,以支持日志级别——INFO、WARN、ERROR。这样可以保持日志消息的一致性。

void warn(const std::string& msg) {
    std::clog << "[WARN] " << msg << "\n";
}

void error(const std::string& msg) {
    std::cerr << "[ERROR] " << msg << "\n";
}

性能:cerr 速度较慢

由于 cerr 每次操作都会刷新,反复写入会很慢。进行大量日志记录时,建议使用 clog 或专用的日志库。

手动刷新 clog

如果您希望 clog 的输出在调试时立即显示,可以手动刷新它。

std::clog << "checkpoint" << std::flush;

写入文件流

同样的模式也适用于文件流。使用 std::ofstream 打开日志文件,然后像使用 clog 一样向其中写入内容。

std::ofstream logFile("app.log");
logFile << "Application started\n";

快速检查

哪个标准流会在每次写入后自动刷新?

回顾

使用 std::cout 输出常规内容,使用 std::cerr 输出紧急的无缓冲错误,使用 std::clog 输出带缓冲的日志。在 shell 中使用 > 和 2> 分别重定向它们。

常见问题解答

「使用 std::cerr 和 std::clog」课时是免费的吗?

是的 — 「使用 std::cerr 和 std::clog」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「使用 std::cerr 和 std::clog」这节课中我会学到什么?

使用 cerr 和 clog 流将诊断信息与日志和程序输出分开 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 std::cerr 和 std::clog」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 正确使用 std::cin 和 std::cout
  2. 使用 iomanip 格式化输出
  3. 使用 getline 安全读取输入
  4. 使用 std::cerr 和 std::clog
← 返回 C++ Academy