C++---cout、cerr、clog

在C++编程里,coutcerrclog是标准库提供的重要输出流对象,在数据输出方面发挥着关键作用。

一、cout:标准输出流

coutstd::ostream 类的对象,其作用是向标准输出设备(一般是控制台)输出数据。它和 C 语言中的 printf 函数类似,但 cout 具有类型安全和运算符重载的优势,使用起来更加方便。

1. 基本用法

借助 << 运算符,能把各种类型的数据输出到 cout

#include <iostream>
using namespace std;int main() {int num = 42;double pi = 3.14159;string name = "Alice";cout << "Hello, World!" << endl;cout << "Number: " << num << endl;cout << "Pi: " << pi << endl;cout << "Name: " << name << endl;return 0;
}

输出结果如下:

Hello, World!
Number: 42
Pi: 3.14159
Name: Alice
2. 格式化输出

通过操纵符(如 setwsetprecision 等)或者成员函数(像 width()precision()),可以对输出格式进行控制。

#include <iostream>
#include <iomanip>
using namespace std;int main() {double value = 123.456789;// 设置宽度和填充字符cout << setw(10) << setfill('*') << 42 << endl;  // 输出:********42// 设置精度cout << fixed << setprecision(3) << value << endl;  // 输出:123.457// 科学计数法cout << scientific << value << endl;  // 输出:1.234568e+02// 布尔值以文字形式输出cout << boolalpha << true << endl;  // 输出:truereturn 0;
}
3. 链式输出

<< 运算符返回的是对 cout 对象的引用,所以可以进行链式输出。

int a = 10, b = 20;
cout << "a = " << a << ", b = " << b << endl;  // 输出:a = 10, b = 20
4. 重定向输出

可以利用 rdbuf() 函数对 cout 的输出缓冲区进行重定向。

#include <iostream>
#include <fstream>
using namespace std;int main() {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();return 0;
}

二、cerr:标准错误流

cerr 同样是 std::ostream 类的对象,它专门用于输出错误信息。和 cout 的主要区别在于,cerr 的输出是不经过缓冲的,会立即显示在终端上。

1. 基本用法

当程序出现错误时,可使用 cerr 输出错误信息。

#include <iostream>
using namespace std;int main() {ifstream file("nonexistent.txt");if (!file.is_open()) {cerr << "Error: Could not open file!" << endl;return 1;}// 其他操作return 0;
}
2. 无缓冲特性

cerr 的输出不会被缓冲,这在需要立即显示错误信息的场景下非常重要。

// 模拟一个长时间运行的进程
for (int i = 0; i < 1000000; ++i) {if (i % 100000 == 0) {cerr << "Processing iteration " << i << endl;  // 立即显示}// 处理逻辑
}
3. 重定向错误输出

cout 一样,cerr 的输出也能被重定向。

ofstream 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 适用于记录程序的执行状态等日志信息。

#include <iostream>
using namespace std;void log(const string& message) {clog << "[LOG] " << message << endl;
}int main() {log("Starting application...");// 程序逻辑log("Application terminated successfully.");return 0;
}
2. 缓冲特性

clog 的输出会先被存储在缓冲区中,直到缓冲区满或者遇到刷新操作。

clog << "This is a log message.";  // 可能不会立即显示
clog << flush;  // 手动刷新缓冲区
3. 日志重定向

同样可以对 clog 的输出进行重定向。

ofstream logFile("app.log");
clog.rdbuf(logFile.rdbuf());clog << "Logging to file..." << endl;  // 写入文件

四、三者的对比与选择

特性coutcerrclog
缓冲机制有缓冲无缓冲有缓冲
默认输出目标标准输出标准错误标准错误
典型应用场景普通程序输出错误信息日志记录
是否可重定向
选择建议:
  • 当需要输出程序的正常结果时,应使用 cout
  • 遇到错误情况,需要立即显示错误信息时,要使用 cerr
  • 进行程序调试或者记录执行状态等日志操作时,适合使用 clog

五、高级应用场景

1. 自定义流缓冲区

可以通过继承 streambuf 类来创建自定义的流缓冲区。

class MyBuffer : public streambuf {
protected:int overflow(int c) override { //override C++11 特性,显式声明该函数重写基类的虚函数,提高代码安全性if (c != traits_type::eof()) { //获取流特性中定义的 EOF(文件结束符)值// 自定义处理逻辑cout << "*" << static_cast<char>(c) << "*";}return traits_type::not_eof(c);}
};// 使用自定义缓冲区
MyBuffer buf;
ostream customOut(&buf);
customOut << "Test" << endl;  // 输出:*T*e*s*t*
2. 多线程环境下的输出

在多线程环境中使用输出流时,需要进行同步操作,以避免输出混乱。

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;mutex coutMutex;void worker(int id) {lock_guard<mutex> lock(coutMutex);cout << "Thread " << id << " is working." << endl;
}int main() {thread t1(worker, 1);thread t2(worker, 2);t1.join();t2.join();return 0;
}
3. 结合 RAII 管理流重定向

利用 RAII(资源获取即初始化)技术,可以更安全地管理流重定向。

class StreamRedirect {
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;  // 写入文件
}  // 离开作用域时自动恢复

六、注意事项

  1. 性能考量

    • 无缓冲的输出(如 cerr)会带来一定的性能开销,所以在性能敏感的场景中应当谨慎使用。
    • 有缓冲的输出(如 coutclog)在频繁刷新缓冲区时,也可能会影响性能。
  2. 线程安全

    • 标准输出流本身并不是线程安全的,在多线程环境下使用时需要进行同步处理。
  3. 资源管理

    • 重定向流缓冲区后,要确保在适当的时候恢复原来的缓冲区。

七、总结

  • cout:是最常用的输出流,适用于普通的程序输出,输出内容会被缓冲。
  • cerr:主要用于输出错误信息,输出不会被缓冲,能保证错误信息立即显示。
  • clog:适用于记录日志,输出会被缓冲,有助于提高性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

脉冲神经网络(Spiking Neural Network, SNN)与知识蒸馏(Knowledge Distillation, KD)

目录 脉冲神经网络&#xff08;Spiking Neural Network, SNN&#xff09; 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09; 三种类别 三种变体 脉冲神经网络&#xff08;Spiking Neural Network, SNN&#xff09; 收到生物神经系统的启发&#xff0c;设计的&a…

使用Java完成下面项目

第一题&#xff1a;从控制台输入十个学生的成绩&#xff0c;使用list集合来保存数据&#xff0c; 遍历并打印其中成绩不及格的成绩&#xff0c;打印最高成绩&#xff0c;最低成绩&#xff0c;并计算及格率代码如下public class Home1 {public static void main(String[] args) …

龙虎榜——20250718

上证指数今天上涨收阳线&#xff0c;继续在5天均线保持强势上涨&#xff0c;个股下跌稍多&#xff0c;大盘股上涨为主。深证指数收小阳线&#xff0c;继续在5天均线上&#xff0c;总体保持强势&#xff0c;调整更多是小票。2025年7月18日龙虎榜行业方向分析1. 医药医疗• 代表标…

2025年华为认证之HCIE-云计算方向的报考流程

一、先搞明白&#xff1a;HCIE - 云计算认证到底是啥&#xff1f; HCIE - 云计算&#xff08;华为认证 ICT 专家 - 云计算&#xff09;是华为体系里云计算领域的顶级认证&#xff0c;说白了&#xff0c;就是证明你有能力搞定大型企业的云平台设计、部署和运维。现在政企、金融…

什么是私有化部署企业即时通讯?吱吱企业即时通讯安全吗?

在企业数字化转型加速的今天&#xff0c;沟通工具的选择已经从满足简单沟通&#xff0c;升级为“安全、高效、可控”。其中&#xff0c;“私有化部署企业即时通讯”成为许多中小型企业、跨国企业以及数据敏感型企业的核心需求。 那么&#xff0c;究竟什么是私有化部署&#xff…

Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框

在 Vue3 项目中&#xff0c;我们经常会用到 ElNotification 作为消息提醒组件&#xff0c;尤其是在异步操作、任务完成或用户需要交互确认时。然而&#xff0c;Element Plus 默认的 Notification 是非交互式的&#xff0c;不能直接嵌入按钮或事件。 今天我们来实现一个带自定义…

下载webrtc M114版本源码只能使用外网googlesource源-命令版

声网、国内源都不行&#xff0c;只能外网googlesource源&#xff01;&#xff01;&#xff01; 二、创建 Ubuntu 容器&#xff08;带目录挂载&#xff09; 拉取Ubuntu镜像 docker pull ubuntu:22.04创建并启动容器&#xff08;挂载Windows目录到容器&#xff09; docker run -i…

Linux运维新手的修炼手扎之第21天

Nginx服务和Tomcat服务1 负载均衡语法格式&#xff1a;upstream[一个或多个]rootubuntu24-13:~# vim /etc/nginx/conf.d/vhost.confupstream group1 {server 10.0.0.16;}upstream group2 {server 10.0.0.14;}server {listen 80;server_name sswang1.magedu.com;location / {pro…

TrOCR: 基于Transformer的光学字符识别方法,使用预训练模型

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" TrOCR: 基于Transformer的光学字符识别方法&#xff0c;使用预训练模型 摘要 文本识别是文档数字化中的一个长期研究问题。现有方法通常基于CNN进行图像理解&#xff0c;基于RNN进行字符级文本生成。此外&#…

西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技

概要2025年6月&#xff0c;西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访我司。庭田科技总经理聂春文携销售团队对西门子代表团表示热烈欢迎&#xff0c;并就当前业务发展方向及未来行业聚焦领域与代表团展开深入交流。 聂春文总经理及销售团队陪同西门…

在 Jenkins 中使用 SSH 部署密钥

本文档介绍了如何在 Jenkins 中配置 SSH 部署密钥&#xff0c;以便更稳定地拉取 Git 仓库代码&#xff0c;避免常见的 RPC 错误。 1. 背景 在使用 Jenkins 进行持续集成时&#xff0c;常常需要从 Git 仓库拉取代码。如果使用 HTTP/HTTPS 协议&#xff0c;有时会遇到 RPC 错误&…

小红书采集工具:无水印图片一键获取,同步采集笔记与评论

我用python语言开发了一款名为“爬xhs图片软件”的工具&#xff0c;该工具不仅能采集图片&#xff0c;还可获取笔记数据、评论数据等内容。 软件界面长这个样子&#xff1a; 采集到的图片&#xff1a;演示视频&#xff1a;https://live.csdn.net/v/485813介绍文章、想你所想&am…

Java行为型模式---命令模式

命令模式基础概念命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。命令模式…

Android性能优化之包体积优化

一、包体积组成与瓶颈分析 1. 典型 APK 结构占比 #mermaid-svg-KEUQMlEifvHlk1CV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KEUQMlEifvHlk1CV .error-icon{fill:#552222;}#mermaid-svg-KEUQMlEifvHlk1CV .erro…

开源Web播放器推荐与选型指南

Video.js3&#xff1a;是市面上最流行的免费、开源 HTML5 视频播放器之一。可用于直播和点播&#xff0c;支持 HLS、DASH、WebM 和 MP4 等多种格式。它可高度自定义&#xff0c;开源社区中有很多皮肤可供选用&#xff0c;还可通过插件配置 Multi - DRM、广告插入、字幕等功能&a…

sql注入以及Python二分查找

sql注入 /level1.php?name<script>alert(1)</script> "><script>alert(1)</script> οnclickalert(1) " οnclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

Coze智能体开发实战-旅游助手

智能体第1步&#xff1a;创建智能体第2步&#xff1a;设置开场白您好&#xff0c;我是广州长隆野生动物园旅游助手&#xff0c;有什么能够帮您&#xff1f;1.景点讲解 2.行程规划 3.天气查询 4.酒店查询第3步&#xff1a;创建工作流第4步&#xff1a;添加“意图识别”行程规划第…

51c视觉~合集13

自己的原文哦~ https://blog.51cto.com/whaosoft/11685452 #GKGNet 多标签分类遇上图卷积网络ViG 本文提出了第一个完全图卷积模型&#xff0c;基于分组K近邻的图卷积网络GKGNet&#xff0c;该模型在灵活且统一的图结构中&#xff0c;同时建模语义标签嵌入与图像块之…

子数组的最大累加和问题(8)0718

题目给定一个数组arr&#xff0c;返回子数组的最大累加和。例如&#xff0c;arr[1,-2,3,5,-2,6,-1],所有的子数组中&#xff0c;[3,5,-2,6]可以累加出最大的和12&#xff0c;所以返回12.解答如果arr中没有正数&#xff0c;产生的最大累加和一定是数组中的最大值。如果arr中有正…

LINUX例行性工作(计划任务)实验操作 ---at和crontab以及系统级别的计划任务

1.atd和crond两个任务管理程序的区别at命令是在指定的时间下只能执行一次任务&#xff1b;crontab命令是可以循环重复&#xff08;周期性&#xff09;的执行定时任务&#xff0c;与windows中的计划任务有些类似.2.指定在2024/08/15 09:00将时间写入testmail.txt文件中[rootmast…