C++中的std::cout与std::cerr、std::clog
本文用于记录C++中std::cout与std::cerr、std::clog的异同
std::cerr 是C++标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般的程序输出。std::clog 是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。
一、 std::cerr 和 std::cout 的主要方面对比:
1. 输出设备:
- std::cerr 输出到标准错误设备,通常是控制台或终端。
- std::cout 输出到标准输出设备,通常也是控制台或终端。
2. 缓冲:
- std::cerr 通常是非缓冲的,即它的输出会立即显示在终端上,无需等待缓冲区填满。
- std::cout 通常是缓冲的,即输出被收集在缓冲区中,然后在换行或程序结束时一次性刷新到终端。
3. 用途:
- std::cerr 用于输出错误消息、异常信息和其他临时或紧急情况的诊断信息,通常用于不会对正常程序流程产生影响的信息输出。
- std::cout 用于一般的程序输出,例如用户界面、数据报告、日志等。
二、 输出错误消息时,与 std::cout 相比,std::cerr 的优势
通过第一部分的介绍,我们可以知道在C++程序中用于输出错误消息时,通常推荐使用 std::cerr 而不是 std::cout,输出报错信息时std::cerr` 的主要优势如下:
1. 非缓冲输出
std::cerr 是非缓冲的,这意味着 输出消息会立即显示在终端上,而不会等待缓冲区刷新 。这在错误和异常处理中很重要,因为它确保错误消息尽快显示,而不会被延迟,从而帮助程序员更快地定位和解决问题。
2. 区分标准输出
使用 std::cerr 使错误消息从标准输出消息(使用 std::cout 输出的消息)明显区分开来。这有助于用户或开发人员在程序运行时识别和定位问题。
3. 标准错误设备
std::cerr 默认输出到标准错误设备,通常是终端或控制台。这是一个专门用于报告错误和异常的设备,不会影响标准输出。
4. 不受缓冲影响
由于 std::cerr 不受输出缓冲的影响,即使程序崩溃或异常终止,错误消息也可以正常显示,这有助于诊断问题。
三、 std::cerr与std::cout的使用示例
在下面的程序中,我们定义了一个名为cout_two_VectorXd的函数,用于按行输出两列Eigen::VectorXd类型的数据,这就要求提供的两个VectorXd类型的参数中存储的数据个数应该相同,否则在输出时会报错
因此,在输出前,对两个参数的大小是否相同进行了判断,若不同,则使用std::cerr给出报错信息,并返回,若相同,则使用std::cout`输出数据
#include <iostream>
#include <Eigen/Eigen>//按行两列Eigen::VectorXd类型的数据
void cout_two_VectorXd(const Eigen::VectorXd& data1, const Eigen::VectorXd& data2)
{if (data1.size() != data2.size()) {std::cerr << "Error: Data sizes do not match." << std::endl;return;}for (int i = 0; i < data1.size(); i++) {std::cout << data1[i] << " " << data2[i] << std::endl;}
}int main() {Eigen::VectorXd x(3); // 创建一个长度为3的向量xx << 1.0, 2.0, 3.0; // 为 x 赋初值Eigen::VectorXd y(3); // 创建一个长度为3的向量yy << 4.0, 5.0, 6.0; // 为 y 赋初值Eigen::VectorXd z(4); // 创建一个长度为4的向量zz << 7.0, 8.0, 9.0, 10; // 为 z 赋初值cout_two_VectorXd(x, y);cout_two_VectorXd(x, z);return 0;
}
上述程序的运行结果如下:
1 4
2 5
3 6
Error: Data sizes do not match.
总之,std::cerr 是专门用于输出错误和异常消息的工具,它提供了一些特性,使其在这些情况下更可靠和有用。虽然 std::cout 也可以用于输出错误消息,但它通常是缓冲的,可能会导致消息延迟显示,而且与一般输出混在一起,不容易识别。因此,推荐在错误和异常处理中使用 std::cerr。
四、补充记录:std::clog
std::clog是c++中的标准日志输出流,类似于 std::cerr,用于输出程序日志和诊断信息,但与 std::cerr 不同,它通常是缓冲的。
详情如下:
std::clog 是C++标准库中的标准日志输出流,用于将程序的日志信息发送到标准错误设备(通常是终端或控制台)。它类似于 std::cerr,但与 std::cerr 不同,std::clog 通常是缓冲的,这意味着输出消息被收集在缓冲区中,然后在换行或程序结束时才一次性刷新到终端。
std::clog 通常用于输出程序的日志信息、诊断信息以及其他不属于错误和异常的消息。它是一个合适的工具,用于跟踪程序的运行、记录事件、调试代码等。
与 std::cerr 一样,std::clog 输出到标准错误设备,通常是终端或控制台。这意味着日志消息会与程序的错误和异常信息分开显示,以帮助用户或开发人员识别和处理问题。
示例用法:
#include <iostream>int main() {// 输出日志消息到 std::clogstd::clog << "This is a log message." << std::endl;return 0;
}
总之,std::clog 是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。它提供了一种与标准输出 std::cout 和标准错误输出 std::cerr 相比更适合输出日志信息的方式。
相关文章:
C++中的std::cout与std::cerr、std::clog
本文用于记录C中std::cout与std::cerr、std::clog的异同 std::cerr 是C标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般…...
No authorization token was found
今天遇到了一个问题,我把前后端逻辑都理了一遍,开始怀疑后端,后端肯定没错了,把前端理了一遍,ok前后端没错,我错。登录哪里需要的token????把我搞懵逼了。 测…...
Kubernetes概述及其组件/核心组件
目录 1、K8S 是什么? 2、为什么要用 K8S? 3、k8s的特性 4、Kubernetes 集群架构与组件 5、核心组件 Master 组件 ●Kube-apiserver ●Kube-controller-manager ●Kube-scheduler 配置存储中心 ●etcd Node 组件 ●Kubelet ●Kube-Proxy ●docker 或…...
毫米波雷达实时采集教
https://www.cnblogs.com/dhyc/p/10510876.html 毫米波雷达实时采集教程---- 以及好网站总结:资料分享——RSP1 多普勒雷达开发套件...
Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析
前言 List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中HashMap集合的面试问题,结合源码分析题目背后的知识点。 关于List的博客文章如下: Java进阶(List)——面试…...
Kotlin 使用@BindingAdapter编译出错
在 Kotlin 中使用 BindingAdapter 注解时,需要确保你的项目正确配置了 Data Binding。 首先,请确保在项目的 build.gradle 文件中启用了 Data Binding: android {// ...dataBinding {enabled true} }接下来,请确保你在正确的地…...
Qt之信号和槽,connect参数分析
connect()方法 Qt进行信号和槽连接,有以下几种方法: static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType Qt::AutoConnection); static QMetaObj…...
Python学习笔记—元组
1、元组定义 元组使用()来定义,元素在()括号内,用逗号隔开 空元组定义,元组名() 注:当元组只有1个元素的时候,需要在元素后面加逗号,…...
【C++项目】高并发内存池第五讲内存回收释放过程介绍
内存回收 1.ThreadCache2.CentralCache3.PageCache 项目源代码:高并发内存池 1.ThreadCache void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size < MAX_BYTES);//计算在哪号桶中,然后插入进去size_t index SizeClass…...
[毕设记录]@学术工具体验:Sread.ai
我是在查RAG相关的时候,在知乎上面看到了这篇回答:浅谈生成式 AI 技术:检索增强生成 RAG - MarvinZ的文章 - 知乎 https://zhuanlan.zhihu.com/p/659248219 然后在末尾看到了这个 sread.ai 在作者主页看到了他关于这个产品的介绍:…...
uboot - 驱动开发 - 驱动模型
说明 类似于linux,为了规范、统一驱动适配和驱动接口调用,uboot定义了一套驱动模型(Driver Model),简称DM。本文基于:u-boot-2021.10。 优点 为同一类ip的驱动定义了统一的操作接口,DM在软件层面做了一定的抽象。分…...
windows 操作系统命令积累
1. 按 "prt sc" 键 截屏 2. 按 "fn" 键让浏览器进入全屏模式,再次按 "fn" 键让浏览器退出全屏模式( ps:惠普笔记本上是 "fn" "f11" ) 3. ipconfig 查看ip信息 4. 查看指定端口被什么进程占用...
数据结构单链表的实现(C语言)
目录 1.实现的接口和功能2.代码块 1.实现的接口和功能 //打印链表 void SLTPrint(SLTNode** phead); //头插 void PushFont(SLTNode** phead, SLTDataType x); //尾插 void PushBack(SLTNode** phead, SLTDataType x); //头删 void PopFont(SLTNode** phead); //尾删 void Pop…...
Postman的高级使用,傻瓜式学习【下】
目录 前言 1、全局变量、环境变量 1.1、概念: 1.2、如何设置全局变量、环境变量 1.3、获取全局变量、环境变量 1.4、案例1:手动设置变量,请求参数获取 1.5、案例2:代码设置变量,代码获取变量 2、Postman读取外部…...
Qt:关闭对话框,动画实现窗体逐渐缩小到消失
关键技术: 1、使用QPropertyAnimation对象,实现动画效果,逐渐缩小窗体尺寸,以及透明度; 2、在对话框缩小时,要将界面中的控件都隐藏起来,并且将对话框布局的Margin修改成0 代码如下ÿ…...
在Windows上 ciphey安装(详细版)
文章目录 前言 一、不想卸载原有的python版本? 二、安装步骤 1.安装python 2.创建虚拟环境vnev 3.在ciphey的虚拟环境中进行激活 4.安装ciphey 三、参数列表 总结 前言 提示:安装了好几次,但是都没安装成功,我使用了三个电脑p…...
【lesson2】数据库的库操作
文章目录 库操作创建数据库删除数据库字符集和校验规则手动设置字符集和校验集不同字符集和校验集之间的区别修改数据库字符集和校验集备份和恢复数据库 库操作 创建数据库 删除数据库 字符集和校验规则 创建数据库的时候,有两个编码集: 1.数据库编码集…...
Android Studio Giraffe解决gradle reload failed问题
settings.gradle.kts中 pluginManagement {repositories {google()mavenCentral()gradlePluginPortal()} } dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()} } 各增加三行内容&#x…...
刷题笔记day06-哈希表
242.有效的字母异位词 // 思路2:排序后在比较是否相等import ("sort""fmt""io""strings""os" )func isAnagram(s string, t string) bool {s1, s2 : []byte(s), []byte(t)// 从小到大排序sort.Slice(s1, func(i…...
springboot项目中如何实现过滤器鉴权
通常来说鉴权都是写在网关当中,对于单体应用也可以在后台服务中通过一个过滤器实现。其实过程与网关当中的没什么不同,只是在gateway当中目前是基于netty响应式的。过程如下: 一、实现Filter接口 定义自己的过滤器,并且实现Filt…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
