新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++中的cout、cerr、clog使用及说明

发布时间:2026/10/1 10:33:17来源:尧图网络
C++中的cout、cerr、clog使用及说明
在C编程里cout、cerr和clog是标准库提供的重要输出流对象在数据输出方面发挥着关键作用。一、cout标准输出流cout是std::ostream类的对象其作用是向标准输出设备一般是控制台输出数据。它和 C 语言中的printf函数类似但cout具有类型安全和运算符重载的优势使用起来更加方便。1. 基本用法借助运算符能把各种类型的数据输出到cout。123456789101112131415#include iostreamusingnamespacestd;intmain() {intnum 42;doublepi 3.14159;string name Alice;cout Hello, World! endl;cout Number: num endl;cout Pi: pi endl;cout Name: name endl;return0;}输出结果如下1234Hello, World!Number: 42Pi: 3.14159Name: Alice2. 格式化输出通过操纵符如setw、setprecision等或者成员函数像width()、precision()可以对输出格式进行控制。123456789101112131415161718192021#include iostream#include iomanipusingnamespacestd;intmain() {doublevalue 123.456789;// 设置宽度和填充字符cout setw(10) setfill(*) 42 endl;// 输出********42// 设置精度cout fixed setprecision(3) value endl;// 输出123.457// 科学计数法cout scientific value endl;// 输出1.234568e02// 布尔值以文字形式输出cout boolalpha true endl;// 输出truereturn0;}3. 链式输出运算符返回的是对cout对象的引用所以可以进行链式输出。12inta 10, b 20;cout a a , b b endl;// 输出a 10, b 204. 重定向输出可以利用rdbuf()函数对cout的输出缓冲区进行重定向。1234567891011121314151617#include iostream#include fstreamusingnamespacestd;intmain() {ofstream file(output.txt);streambuf* oldBuf cout.rdbuf();// 保存原来的缓冲区cout.rdbuf(file.rdbuf());// 将输出重定向到文件cout This will be written to the file. endl;cout.rdbuf(oldBuf);// 恢复原来的输出cout This will be written to the console. endl;file.close();return0;}二、cerr标准错误流cerr同样是std::ostream类的对象它专门用于输出错误信息。和cout的主要区别在于cerr的输出是不经过缓冲的会立即显示在终端上。1. 基本用法当程序出现错误时可使用cerr输出错误信息。12345678910111213#include iostreamusingnamespacestd;intmain() {ifstream file(nonexistent.txt);if(!file.is_open()) {cerr Error: Could not open file! endl;return1;}// 其他操作return0;}2. 无缓冲特性cerr的输出不会被缓冲这在需要立即显示错误信息的场景下非常重要。1234567// 模拟一个长时间运行的进程for(inti 0; i 1000000; i) {if(i % 100000 0) {cerr Processing iteration i endl;// 立即显示}// 处理逻辑}3. 重定向错误输出和cout一样cerr的输出也能被重定向。1234567ofstream errorFile(errors.log);streambuf* oldBuf cerr.rdbuf();cerr.rdbuf(errorFile.rdbuf());cerr This error will be logged to errors.log endl;cerr.rdbuf(oldBuf);// 恢复三、clog标准日志流clog也是std::ostream类的对象用于输出日志信息。它和cerr的区别在于clog的输出是经过缓冲的。1. 基本用法clog适用于记录程序的执行状态等日志信息。123456789101112131415#include iostreamusingnamespacestd;voidlog(conststring message) {clog [LOG] message endl;}intmain() {log(Starting application...);// 程序逻辑log(Application terminated successfully.);return0;}2. 缓冲特性clog的输出会先被存储在缓冲区中直到缓冲区满或者遇到刷新操作。12clog This is a log message.;// 可能不会立即显示clog flush;// 手动刷新缓冲区3. 日志重定向同样可以对clog的输出进行重定向。1234ofstream logFile(app.log);clog.rdbuf(logFile.rdbuf());clog Logging to file... endl;// 写入文件四、三者的对比与选择特性coutcerrclog缓冲机制有缓冲无缓冲有缓冲默认输出目标标准输出标准错误标准错误典型应用场景普通程序输出错误信息日志记录是否可重定向是是是选择建议当需要输出程序的正常结果时应使用cout。遇到错误情况需要立即显示错误信息时要使用cerr。进行程序调试或者记录执行状态等日志操作时适合使用clog。五、高级应用场景1. 自定义流缓冲区可以通过继承streambuf类来创建自定义的流缓冲区。123456789101112131415classMyBuffer :publicstreambuf {protected:intoverflow(intc) override {//override C11 特性显式声明该函数重写基类的虚函数提高代码安全性if(c ! traits_type::eof()) {//获取流特性中定义的 EOF文件结束符值// 自定义处理逻辑cout *static_castchar(c) *;}returntraits_type::not_eof(c);}};// 使用自定义缓冲区MyBuffer buf;ostream customOut(buf);customOut Test endl;// 输出*T*e*s*t*2. 多线程环境下的输出在多线程环境中使用输出流时需要进行同步操作以避免输出混乱。1234567891011121314151617181920#include iostream#include mutex#include threadusingnamespacestd;mutex coutMutex;voidworker(intid) {lock_guardmutex lock(coutMutex);cout Thread id is working. endl;}intmain() {threadt1(worker, 1);threadt2(worker, 2);t1.join();t2.join();return0;}3. 结合 RAII 管理流重定向利用 RAII资源获取即初始化技术可以更安全地管理流重定向。12345678910111213141516171819202122classStreamRedirect {public:StreamRedirect(ostream stream, streambuf* newBuf): stream(stream), oldBuf(stream.rdbuf()) {stream.rdbuf(newBuf);}~StreamRedirect() {stream.rdbuf(oldBuf);}private:ostream stream;streambuf* oldBuf;};// 使用示例ofstream file(output.txt);{StreamRedirect redirect(cout, file.rdbuf());cout Redirected output endl;// 写入文件}// 离开作用域时自动恢复六、注意事项性能考量无缓冲的输出如cerr会带来一定的性能开销所以在性能敏感的场景中应当谨慎使用。有缓冲的输出如cout、clog在频繁刷新缓冲区时也可能会影响性能。线程安全标准输出流本身并不是线程安全的在多线程环境下使用时需要进行同步处理。资源管理重定向流缓冲区后要确保在适当的时候恢复原来的缓冲区。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

PaddleOCR-VL-1.6实测:0.9B文档解析九大场景与部署调优 2026/10/1 13:25:13

PaddleOCR-VL-1.6实测:0.9B文档解析九大场景与部署调优

做文档解析这行的朋友应该都有过类似经历:一份两百页的扫描版年报丢过来,要求当天把里面的正文、表格、公式、图表标题全部拆成结构化数据。以前这种活儿基本靠人肉加一堆脚本硬扛,OCR 只负责把字抠出来,剩下的版面还原、阅读顺序…

阅读更多 →
AI数据中心算电协同:层级化管控与全域风险防控体系研究 2026/10/1 13:25:06

AI数据中心算电协同:层级化管控与全域风险防控体系研究

1. 从“算力堆砌”到“算电共生”:这个课题到底在解决什么如果你最近一年跟数据中心打交道,大概率会听到两种抱怨:一种是“卡到了,电不够”,另一种是“电够用,但不敢满跑”。前者说的是算力扩容受制于供电容…

阅读更多 →
tushare+TensorFlow实战:LSTM股票开盘价预测全流程解析 2026/10/1 13:24:53

tushare+TensorFlow实战:LSTM股票开盘价预测全流程解析

简介:一份面向金融时序预测学习者的完整示例,整合tushare数据接口与TensorFlow 2.0,以贵州茅台历史行情为样本,实现RNN和LSTM对开盘价的预测。资源包含数据获取、预处理、建模、训练与评估全流程代码。压缩包共5个文件&#xff1a…

阅读更多 →
tushare+TensorFlow2.0:用RNN/LSTM预测贵州茅台开盘价 2026/10/1 13:24:53

tushare+TensorFlow2.0:用RNN/LSTM预测贵州茅台开盘价

简介:面向金融时序预测与深度学习入门人群,这份资源以贵州茅台历史行情为例,演示如何通过tushare获取真实A股数据,并基于TensorFlow 2.0搭建RNN和LSTM模型预测开盘价,完整覆盖数据抓取、清洗归一化、模型构建、训练评估…

阅读更多 →
Coze二次开发实战:API调用、工作流扩展与私有化部署避坑指南 2026/10/1 13:24:53

Coze二次开发实战:API调用、工作流扩展与私有化部署避坑指南

1. 从“拖拽能用”到“上线能扛”:Coze 二次开发到底在解决什么问题 很多人第一次接触 Coze,都是被它的可视化编排吸引进来的——拖几个节点、连几条线,一个能跑通的对话机器人就出来了。但真正把它往业务系统里塞的时候,问题立刻…

阅读更多 →
Strands Agents Harness SDK 实战:从手写 Agent 循环到生产级工程化 2026/10/1 13:24:53

Strands Agents Harness SDK 实战:从手写 Agent 循环到生产级工程化

Agent 开发这件事,过去一年里我最大的感受就是:写一个能跑的 Demo 只要一个下午,但把它变成能上线、能观测、能恢复、能扩展的东西,可能要再花两个月。Strands Agents Harness SDK 这个项目之所以值得单独拿出来聊,就是…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉