cout是c++还是c_c语言中cout的用法

cout是c++还是c_c语言中cout的用法之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以下的内容均是本人从网上查阅资料看来整理的,暂时还没有查阅官方资料,不保证准确,欢迎讨论)其实大家平常常会用的主要有三个:c

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以下的内容均是本人从网上查阅资料看来整理的,暂时还没有查阅官方资料,不保证准确,欢迎讨论)

其实大家平常常会用的主要有三个:cout、cerr、clog,首先简单介绍下三者。

这三者在C++中都是标准IO库中提供的输出工具(至于有关的重载问题在此不讨论):

cout:写到标准输出的ostream对象;

cerr:输出到标准错误的ostream对象,常用于程序错误信息;

clog:也是输出标准错误流(这点儿和cerr是一样的),貌似平时很少用到这个啊;

 

具体在输出的时候,三者是有区别的:

1、cout经过缓冲后输出,默认情况下是显示器。这是一个被缓冲的输出,是标准输出,并且可以重新定向(关于重新定向的意思可以参考下面的例子);

2、cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误,默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向(重定向这点儿好像有争论,有些人说和系统有关,本人还不太明白)

 

 

对于为什么有cerr和clog

  比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。

  你说,你到什么地方借内存,存放你的错误信息?

  所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。

  缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。

 

 

附:

 

#include <iostream>

using namespace std;

int main()

{

cout << “cout” << endl;

cerr << “cerr” << endl;

return 0;

}

运行此程序之后,我们在命令行执行如下命令:

假设编译运行后的可执行文件名为cerr.exe,其目录为E:\cpro\cerr\Debug\cerr.exe

在命令行下,切换到这个目录下,执行命令:cerr>test.log

命令行输出如下:

E:\cpro\cerr\Debug>cerr>>test2.log

Cerr(这是在命令行下输出的)

查看test2.log文件,发现里面只有

Cout

一行。

可能这个就是所谓的重定向输出。

从这里可以看出:
cout是在终端显示器输出,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符. 

cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多,有点不同就是cout 
通常是传到显示器输出,但可以被重定向输出到文件,而cerr流中的信息只能在显示器输出. 
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.

今天看C++Primer(第四版)的时候又看到了这几个,摘抄一段话,供大家参考:

“标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,而clog对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行窗口联系起来,这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr、clog时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出流的方法。利用重定向可以将这些流与所选择的文件联系起来”

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167592.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript-ECMAScript5-JS基础语法「建议收藏」

    JavaScript-ECMAScript5-JS基础语法「建议收藏」JavaScript-ECMAScript5-基础语法

    2022年8月11日
    7
  • mp4 avc格式_sps_pps[通俗易懂]

    mp4 avc格式_sps_pps[通俗易懂]http://blog.csdn.net/sunnylgz/article/details/7680203

    2022年10月17日
    1
  • python读取txt文件的行数

    python读取txt文件的行数python读取txt文件的行数python读取txt文件的行数python读取txt文件的行数count=len(open(filepath,’rU’).readlines())

    2022年5月23日
    56
  • eclipse环境下spring整合mybatis详细教程[通俗易懂]

    eclipse环境下spring整合mybatis详细教程[通俗易懂]系列目录第一篇:3分钟快速了解Mybatis的基础配置第二篇:带你3分钟了解Mybatis映射文件(sql,resultMap等映射)第三篇:三分钟带你了解mybatis关联映射(案例分析一对一,多对多)原创不易,如若喜欢,就点一点赞,关注一下吧!文章目录系列目录一、整合环境搭建-jar包准备1.spring所需要使用的jar包有(8+2):2.mybatis所需要使用的jar包有3.spring整合mybatis的中间jar二、整合环境搭建-创建项目1.eclipse环境创建2.jar添

    2022年5月2日
    53
  • mysql批量新增数据_word修改内容目录怎么更新

    mysql批量新增数据_word修改内容目录怎么更新建表CREATETABLE`t`(`id`int(11)NOTNULL,`age`int(11)DEFAULTNULL,`name`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf81.insertintovalues、inser…

    2022年10月6日
    3
  • Java服务器端结构[通俗易懂]

    Java服务器端结构[通俗易懂]数据库连接池:应用程序想要访问数据库中的数据,需要和数据库建立连接。而数据库连接池就是用来负责分配、管理和释放数据库连接,你可以把数据库连接池理解为一把钥匙,而数据库就是锁。没有数据库连接池 ,应用程序就不方便访问数据库。1)数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个 2)释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数

    2022年6月3日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号