C++中的std::cout与std::cerr、std::clog

2023-10-31 04:20
文章标签 c++ std cout cerr clog

本文主要是介绍C++中的std::cout与std::cerr、std::clog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   本文用于记录C++中std::cout与std::cerr、std::clog的异同

   std::cerr 是C++标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般的程序输出。std::clog 是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。

   一、 std::cerrstd::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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312773

相关文章

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关