比特派钱包网址|endl

比特派钱包网址 2024-03-17 08:36:35

C++中endl的本质是什么-CSDN博客

>

C++中endl的本质是什么-CSDN博客

C++中endl的本质是什么

最新推荐文章于 2023-01-27 22:44:03 发布

xiaofei0859

最新推荐文章于 2023-01-27 22:44:03 发布

阅读量4.5w

收藏

239

点赞数

117

分类专栏:

c++基础

c++基础

专栏收录该内容

3 篇文章

7 订阅

订阅专栏

1. endl的本质

自从在C语言的教科书中利用Hello world程序作为学习的起点之后,很多程序设计语言的教科书都沿用了这个做法。我们写过的第一个C++程序可能就是这样的。

#include

using namespace std;

int main(){

cout<<"Hello world"<

}

123456

学习过C语言的程序猿自然会把输出语句与C语言中的输出语句联系起来,也就是说:  cout<<”Hello world”<

但是,如果我们定义char c=endl;会得到一个编译错误,这说明endl并不是一个字符,所以应该到系统头文件中去查找endl的定义。通过VS2012转到定义,找到了endl的定义如下:

template inline basic_ostream<_Elem, _Traits>&

__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)

{ // insert newline and flush stream

_Ostr.put(_Ostr.widen('\n'));

_Ostr.flush();

return (_Ostr);

}

1234567

从定义中看出,endl是一个函数模板,它实例化之后变成一个模板函数,其作用如这个函数模板的注释所示,插入换行符并刷新输出流。其中刷新输出流指的是将缓冲区的数据全部传递到输出设备并将输出缓冲区清空。

2.cout<< endl的介绍

endl是一个函数模板,再被使用时会实例化为模板函数。但是函数调用应该使用一对圆括号,也就是写成endl()的形式,而在语句cout<<”Hello world”<

在头文件iostream中,有这样一条申明语句:extern ostream& cout;这说明cout是一个ostream类对象。而<<原本是用于移位运算的操作符,在这里用于输出,说明它是一个经过重载的操作符函数。如果把endl当做一个模板函数,那么cout<

查找ostream类的定义,发现其实是另一个类模板实例化之后生成的模板类,即:

typedef basic_ostream > ostream;

1

所以,实际上应该在类模板basic_ostream中查找operator<<()的重载版本。在头文件ostream中查找basic_ostream的定义,发现其中operator<<作为成员函数被重载了17次,其中的一种:

typedef basic_ostream<_Elem, _Traits> _Myt;

_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))

{ // call basic_ostream manipulator

_DEBUG_POINTER(_Pfn);

return ((*_Pfn)(*this));

}

1234567

在ostream类中,operator<<作为成员函数重载方式如下:

ostream& ostream::operator<<(ostream& (*op)(ostream&))

{

return (*op)(*this);

}

1234

这个重载正好与endl函数的申明相匹配,所以<<后面是可以跟着endl 。也就是说,cout对象的<<操作符接收到endl函数的地址后会在重载的操作符函数内部调用endl函数,而endl函数会结束当前行并刷新输出缓冲区。

为了证明endl是一个 函数模板,或者说endl是一个经过隐式实例化之后的模板函数,我们把程序改造如下:

#include

using namespace std;

int main(){

cout<<"Hello world"<<&endl;

}

123456

这个程序可以正常运行,并且结果完全同上一个程序。原因是对于一个函数而言,函数名本身就代表函数的入口地址,而函数名前加&也代表函数的入口地址。

3.endl其实是IO操纵符

实际上,endl被称为IO操纵符,也有翻译成IO算子的。IO操作符的本质是自由函数,他们并不封装在某个类的内部,使用时不采用显示的函数调用的形式。在< iostream>头文件中定义的操纵符有:

endl:输出时插入换行符并刷新流

endls:输出时在字符 插入NULL作为尾符

flush:刷新缓冲区,把流从缓冲区输出到目标设备,并清空缓冲区

ws:输入时略去空白字符

dec:令IO数据按十进制格式

hex:令IO数据按十六进制格式

oct:令IO数据按八进制格式

1234567

在< iomanip>头文件中定义的操作符有:

setbase(int)

resetiosflags(long)

setiosflags(long)

setfill(char)

setprecision(int)

setw(int)

123456

这些格式控制符大致可以替代ios的格式函数成员的功能,且使用比较方便。例如,为了把整数345按16进制输出,可以采用两种方式:

int i=345;

cout.setf(ios::hex,ios::basefield);

cout<

123

或者:

cout<

1

可以看出采用格式操纵符比较方便,二者的区别主要在于:格式成员函数是标准输出对象cout的成员函数,因此在使用时必须和cout同时出现,而操纵符是自由函数,可以独立出现,使用格式成员函数要显示采用函数调用的形式,不能用IO运算符”<<”和”>>”形成链式操作。

4.自定义格式操纵符

除了利用系统预定义的操纵符来进行IO格式的控制外,用户还可以自定义操纵符来合并程序中频繁使用的IO读写操作。定义形式如下:

输出流自定义操纵符:

ostream &操纵符名(ostream &s)

{

  自定义代码

  return s;

}

12345

输入流自定义操纵符:

istream &操纵符名(istream &s{

  自定义代码

  return s;

}

1234

示例代码如下:

#include

#include

using namespace std;

std::ostream& OutputNo(std::ostream& s)//编号格式如:0000001

{

s<

return s;

}

std::istream& InputHex (std::istream& s)//要求输入的数为十六进制数

{

s>>std::hex;

return s;

}

int main()

{

std::cout<

int a;

std::cout<<"请输入十六进制的数:";

std::cin>> InputHex >>a;

std::cout<<"转化为十进制数:"<

return 0;

}

12345678910111213141516171819202122232425

程序运行结果: 

程序中OutputNo和InputHex都是用户自定义的格式操纵符,操作符的函数原型必须满足cout对象的成员函数operator<<()的重载形式:

ostream& ostream::operator<<(ostream& (*op)(ostream&));

1

所以只要编写一个返回值为std::ostream&,接收一个类型为std::ostream&参数的函数,就可以把函数的入口地址传递给cout.operator<<(),完成格式操纵符的功能。

参考文献

[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P326-P329]  [2]http://blog.csdn.net/k346k346/article/details/46836029

优惠劵

xiaofei0859

关注

关注

117

点赞

239

收藏

觉得还不错?

一键收藏

知道了

8

评论

C++中endl的本质是什么

1. endl的本质自从在C语言的教科书中利用Hello world程序作为学习的起点之后,很多程序设计语言的教科书都沿用了这个做法。我们写过的第一个C++程序可能就是这样的。#include using namespace std;int main(){ cout"Hello world"<

复制链接

扫一扫

专栏目录

C++中fstream,ifstream及ofstream用法浅析

12-31

c++中有个类叫做fstream,可以实现打开一个文件作为流。创建一个对象,然后调用该对象的open函数,其主要有两个参数,第一个参数是字符串,表示文件的地址,第二个参数是代开方式,如:

fstream fin(a.txt,ios::in);

if(fin)

{

cout<

fin.close();

}

else

{

cout<

}

注意:如果文件不存在,则打开失败。如果这里打开方式采用的是ios::out,那么如果文件不存在,则会创建该文件。

fstream还有两个子类分别是ifstrea

c++学习笔记

最新发布

m0_54720387的博客

09-25

346

c++初学者学习c++

8 条评论

您还未登录,请先

登录

后发表或查看评论

C++中endl

m0_55826123的博客

09-09

5616

endl就是end line的意思,也就是“结束此行”

实际上有两个作用

换行

加"<

清空缓冲区

对缓冲流进行冲刷,将缓冲区的数据全部传递到输出设备并将输出缓冲区清空,使得流中所剩字符被写入输出序列。

...

endl在c语言中的作用,C++中的endl

weixin_34920313的博客

05-18

5362

从开始接触C++到现在,一直以为语句cout << "hello world!" << endl;中的endl只是一个相当于C中的换行‘\n’;直到今天,莫名的搜索了一下endl才发现了一个惊天大秘密,原理endl不仅仅是一个换行那么简单,它居然是一个函数模板,实例化后变成一个模板函数,作用就是insertnewline and flush stream;// MANIP...

浅析c++ 中const关键字

12-31

const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

define与const的区别

1.define作用在预处理时,是简单地字符替换

2. const作用在编译时,具有类型检查的功能

3. const必须进行初始化

常量指针与指针常量

#include

using std::endl;

using std::cout;

int main()

{

int a = 100;

const int *pa = &

c++中struct使用注意事项

01-20

1.C++的结构体变量在声明的时候可以省略struct,在c中这样是不可以的,例子如下

#include

#include

using namespace std;

struct test{

int num;

string name;

};

int main(void)

{

test t;

t.num=1;

t.name=jack;

cout<

}

2.c++的结构体声明可以声明在main()函数中,也可以在main()函数之前,在之前的话,整个程序都可以调用,这也是最常用的

C++ endl 详解

weixin_30311605的博客

09-02

2649

我们在最初学习C++语言时就接触到"cout<

首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<&...

cout后面输出时加endl和不加endl的区别

热门推荐

qq_33221533的博客

07-14

7万+

本文探讨一下C++中使用的时候加endl和不加endl的区别首先,endl就是end line的区别,也就是“结束此行”,但实际上有两个操作1 换行2 对缓冲流进行冲刷,使得流中所有剩余字符被写入输出序列。其实作用说白了就是加<<endl后会有一个换行。下次再用cout输出字符时就会在下一行开始输出,如果不加,就会跟在当前行的最后输出。下面给出一个例子,这个例子是华为机试的例子,就是说...

C++中cout、cin和endl的用法

Lee_Shuai的博客

11-23

7万+

转自:http://blog.csdn.net/zhanghaotian2011/article/details/8868577

 

输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。

  

C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C+

C++学习记录20--endl,'\n',"\n"

tmxk13的博客

11-20

496

endl '\n' "\n"

C++中一些小细节

xiaosi的博客

04-08

468

1-

"\n"表示一个字符串,只有一个数据是回车。

'\n'表示一个字符。

这两个在输出上是一样的!

2-

关于endl;

a.在 C++ 中,终端输出换行时,用 cout<<…<

【C++】endl和\n的区别

08-03

记得上大学时教C++的美女老师讲:endl和'\n'是一样的,都有换行的作用。教材上好像也是这样讲的,所以一直对此深信不疑,在一些简单程序中互换使用,效果也确实一样。最近写了一个小示例,终于发现这两个命令不完全相同。

C++ 中循环链表和约瑟夫环

01-01

循环链表和约瑟夫环

循环链表的实现

单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表。当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head。

代码实现分为四部分:

初始化

插入

删除

定位寻找

代码实现:

void ListInit(Node *pNode){

int item;

Node *temp,*target;

cout<<输入0完成初始化<>item;

if(!item)

c++编程练习 025:这是什么鬼delete

01-06

北大程序设计与算法(三)测验题汇总(2020春季)

描述

程序填空输出指定结果

#include

using namespace std;

class A

{

public:

A() { }

// 在此处补充你的代码

};

class B:public A {

public:

~B() { cout << destructor B << endl; }

};

int main()

{

A * pa;

pa = new B;

delete pa;

return 0;

}

输入

输出

destructor B

destructor A

样例输入

样例输出

destru

endl 和 \n 的区别

影龙武的博客qq_43594119

08-28

2426

参考博客:https://blog.csdn.net/u011675745/article/details/51939094

endl 和 \n 在 C++ 中都可以用来换行,std::endl是流操作,"\n"表示内容为一个回车符的字符串,它们之间还是有一些区别的。

\n 只代表换行的转义字符。\n 是C中的格式输出换行,C++ 保留了下来;输出 \n 是实际输出了的 \10 ,往输出流里添加...

c++中endl到底是什么?

wtd_60的专栏

02-09

4298

探讨endl在系统中的具体表示形式

C语言/C++常见习题问答集锦(六十三) 之endl引发的思考

hnjzfwy的博客

01-08

1121

C语言/C++开发的小伙伴们,对于endl,大家可能都不陌生吧,本文探讨一下C++中使用的时候加endl和不加endl的区别,可能有的小伙伴们认为太简单了,这个有必要讨论么,其实我们真正的理解endl了,有些小伙伴看到书山写了,也就照着写,只是一知半解,甚至不理解,本篇我们结合实例,给小伙伴们详细讲解下。

说说std::endl函数

五月花

11-27

6523

所谓std::endl,原来就是一个模板函数名,相当于函数指针啊。

该函数以引用的方式接收一个输出对象,经过处理后,再以引用的方式返回该对象本身。

#include

int main(void)

{

endl(std::cout << "Test 4 std::endl");

endl(std::cout << "Here is the 2nd Line!");

}

请不要对endl前面不加std命名空间限定符感到不解,请查看Koenig looup法则,或者叫ADL法

C++中cout的基础语法与换行符endl的用法

2201_75328713的博客

01-27

3730

1.cout的基本用法

2.endl的基本用法

3.两个关键字的书写格式

c++中类的对象可以直接作为类的成员变量吗?

06-06

对象成员本质上就是一个类对象,可以在另一个类中声明和定义,就像声明和定义其他数据成员一样。 以下是一个使用对象成员的示例: ```c++ class Point { public: Point(int x, int y) : x(x), y(y) {} int getX...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

xiaofei0859

CSDN认证博客专家

CSDN认证企业博客

码龄16年

暂无认证

55

原创

12万+

周排名

123万+

总排名

268万+

访问

等级

2万+

积分

425

粉丝

642

获赞

125

评论

1940

收藏

私信

关注

热门文章

硬盘三大种类( SSD ; HHD ; HDD )

186949

recv send 阻塞和非阻塞

84919

什么是2MSL

66961

C++中endl的本质是什么

45935

Socket连接出现大量的FIN_WAIT_2状态

42994

分类专栏

架构

fastdfs分布式文件系统

24篇

linux rsync 同步

2篇

nginx

46篇

raid

2篇

Android

6篇

DB

25篇

linux 同步

网络测试工具

2篇

进程内存

12篇

编译链接

13篇

socket

14篇

云计算

11篇

加密

9篇

运维

10篇

IO

13篇

TCP/IP

22篇

http

21篇

EPOLL

12篇

操作系统

17篇

文件I/O缓冲

19篇

磁盘IO

23篇

转码

1篇

python

14篇

linux

23篇

性能

9篇

算法

29篇

fs

1篇

存储

12篇

hadoop

7篇

gluster

2篇

GDB

7篇

面试

14篇

hash

2篇

无锁数据结构

2篇

并行计算

4篇

c/c++

22篇

数据结构

1篇

搜索

1篇

Linux 基础

4篇

c++基础

3篇

sql基础

1篇

java基础

6篇

服务

深度

1篇

最新评论

硬盘三大种类( SSD ; HHD ; HDD )

m0_51917545:

买个贵一点,高可靠性的M2即可,比如致钛的TLC颗粒。

阻塞、非阻塞、异步、同步以及select/poll和epoll

qq_41309646:

个人认为真正理想的异步非阻塞,应该是内核线程填充事件链表后,主动通知用户线程,或者调用应用程序事先注册的回调函数来处理数据,如果还需要用户线程不停的轮询来获取事件信息,就不是太完美了,所以也有不少人认为epoll是伪AIO,还是有道理的。

这基本就得是信号机制了。

硬盘三大种类( SSD ; HHD ; HDD )

q-类星体:

写的不错,也很透彻,但是在这个里面有几个部分可以进行优化,比如训练和推理部分,在这个部分可以直接租一个服务器,autodl,inscode和炼丹侠都有算力市场,随便租一个A100然后去跑自己的任务,而且在这个云服务器上也不需要配置环境,能省出来很大一部分精力去干其他的事情

C++中endl的本质是什么

Cat Bayi:

大佬好啊,我是CSDN博主Cat_Bayi,最近更新的文章《C++教程 - How to C++系列专栏第2篇》参考了大佬的文章,特此感谢

博客链接:https://blog.csdn.net/cat_bayi/article/details/132132360

数据摘要算法的测试效率(SHA、MD5和CRC32)

fxl1023:

可以看这里的测试,crc快很多,https://iorilan.medium.com/comparison-of-all-hashing-algorithms-88eda61f064a

本机测试也是差不多的结果

[code=plain]

~ time crc32 ndroid-studio-2023.1.1.9-mac_arm.zip

f7a60f72

crc32 android-studio-2023.1.1.9-mac_arm.zip 0.13s user 0.23s system 78% cpu 0.463 total

~ time md5 android-studio-2023.1.1.9-mac_arm.zip

MD5 (android-studio-2023.1.1.9-mac_arm.zip) = 1ade0aa6c364fc398725d8fba7629894

md5 android-studio-2023.1.1.9-mac_arm.zip 2.26s user 0.22s system 106% cpu 2.328 total

[/code]

最新文章

线程之间共享哪些资源

进程和线程、协程的区别

Kubeflow 入门——为 Kubernetes 打造的组件化、可移植、可扩展的机器学习堆栈

2019年2篇

2018年4篇

2017年152篇

2016年242篇

2015年113篇

2014年36篇

2012年13篇

2011年55篇

2010年116篇

2009年14篇

目录

目录

分类专栏

架构

fastdfs分布式文件系统

24篇

linux rsync 同步

2篇

nginx

46篇

raid

2篇

Android

6篇

DB

25篇

linux 同步

网络测试工具

2篇

进程内存

12篇

编译链接

13篇

socket

14篇

云计算

11篇

加密

9篇

运维

10篇

IO

13篇

TCP/IP

22篇

http

21篇

EPOLL

12篇

操作系统

17篇

文件I/O缓冲

19篇

磁盘IO

23篇

转码

1篇

python

14篇

linux

23篇

性能

9篇

算法

29篇

fs

1篇

存储

12篇

hadoop

7篇

gluster

2篇

GDB

7篇

面试

14篇

hash

2篇

无锁数据结构

2篇

并行计算

4篇

c/c++

22篇

数据结构

1篇

搜索

1篇

Linux 基础

4篇

c++基础

3篇

sql基础

1篇

java基础

6篇

服务

深度

1篇

目录

评论 8

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

C++中 \n 与 endl 的区别是什么?

C++中 \n 与 endl 的区别是什么?

菜鸟教程 -- 学的不仅是技术,更是梦想!

首页

HTML

CSS

JavaScript

Vue

Bootstrap

NodeJS

Python3

Python2

Java

C

C++

C#

Go

SQL

Linux

jQuery

本地书签

首页

HTML

CSS

JS

本地书签

Search

Python3 教程

Python2 教程

Vue3 教程

vue2 教程

Bootstrap3 教程

Bootstrap4 教程

Bootstrap5 教程

Bootstrap2 教程

C++中 \n 与 endl 的区别是什么?

原文: C++ 教程

  

KgdBukn

C++中 "\n" 与 endl 的区别是什么?

"\n" 表示内容为一个回车符的字符串。std::endl 是流操作子,输出的作用和输出 "\n" 类似,但可能略有区别。

std::endl 输出一个换行符,并立即刷新缓冲区。

例如:

std::cout << std::endl;

相当于:

std::cout << '\n' << std::flush;

或者

std::cout << '\n'; std::fflush(stdout);

由于流操作符 << 的重载,对于 '\n' 和 "\n",输出效果相同。

对于有输出缓冲的流(例如cout、clog),如果不手动进行缓冲区刷新操作,将在缓冲区满后自动刷新输出。不过对于 cout 来说(相对于文件输出流等),缓冲一般体现得并不明显。但是必要情况下使用 endl 代替 '\n' 一般是个好习惯。

对于无缓冲的流(例如标准错误输出流cerr),刷新是不必要的,可以直接使用 '\n'。

更多解析

  星铭 cainiao

"\n" 表示一个字符串,只有一个数据是回车符。

'\n' 表示一个字符。

这两个在输出上是一样的!

关于 endl:

1、在 C++ 中,终端输出换行时,用 cout<<......<

2、endl 除了写 '\n' 进外,还调用 flush 函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕.考虑效率就用 '\n'。

3、cout *lt;< endl; 除了往输出流中插入一个 '\n' 还有刷新输出流的作用。

cout << endl;

等价于:

\cout << '\n' << flush;

在没有必要刷新输出流的时候应尽量使用 cout << '\n', 过多的 endl 是影响程序执行效率低下的因素之一。

教程列表

ADO 教程

Ajax 教程

Android 教程

Angular2 教程

AngularJS 教程

AppML 教程

ASP 教程

ASP.NET 教程

Bootstrap 教程

Bootstrap4 教程

Bootstrap5 教程

C 教程

C# 教程

C++ 教程

Chart.js 教程

CSS 参考手册

CSS 教程

CSS3 教程

Django 教程

Docker 教程

DTD 教程

ECharts 教程

Eclipse 教程

FastAPI 教程

Firebug 教程

Font Awesome 图标

Foundation 教程

Git 教程

Go 语言教程

Google 地图 API 教程

Highcharts 教程

HTML DOM 教程

HTML 参考手册

HTML 字符集

HTML 教程

HTTP 教程

ionic 教程

iOS 教程

Java 教程

JavaScript 参考手册

Javascript 教程

jQuery EasyUI 教程

jQuery Mobile 教程

jQuery UI 教程

jQuery 教程

JSON 教程

JSP 教程

Julia 教程

Kotlin 教程

Linux 教程

Lua 教程

Markdown 教程

Matplotlib 教程

Maven 教程

Memcached 教程

MongoDB 教程

MySQL 教程

Node.js 教程

NumPy 教程

Pandas 教程

Perl 教程

PHP 教程

PostgreSQL 教程

Python 3 教程

Python 基础教程

Python 量化交易

R 教程

RDF 教程

React 教程

Redis 教程

RSS 教程

Ruby 教程

Rust 教程

Sass 教程

Scala 教程

SciPy 教程

Servlet 教程

SOAP 教程

SQL 教程

SQLite 教程

SVG 教程

SVN 教程

Swift 教程

TCP/IP 教程

TypeScript 教程

VBScript 教程

Vue.js 教程

Vue3 教程

W3C 教程

Web Service 教程

WSDL 教程

XLink 教程

XML DOM 教程

XML Schema 教程

XML 教程

XPath 教程

XQuery 教程

XSLFO 教程

XSLT 教程

数据结构

正则表达式

测验

浏览器

网站品质

网站建设指南

网站服务器教程

设计模式

在线实例

·HTML 实例

·CSS 实例

·JavaScript 实例

·Ajax 实例

·jQuery 实例

·XML 实例

·Java 实例

字符集&工具

· HTML 字符集设置

· HTML ASCII 字符集

· JS 混淆/加密

· PNG/JPEG 图片压缩

· HTML 拾色器

· JSON 格式化工具

· 随机数生成器

最新更新

·

Rust 宏

·

Seaborn 教程

·

Pandas 相关性分析

·

31.2k star, 免...

·

Dev Home —...

·

免费开源的 AI ...

·

11.2k star, 免...

站点信息

·

意见反馈

·

免责声明

·

关于我们

·

文章归档

关注微信

Copyright © 2013-2024 菜鸟教程 

runoob.com All Rights Reserved. 备案号:闽ICP备15012807号-1

微信关注

C++中cout、cin和endl的用法_count<>

C++中cout、cin和endl的用法_count<

C++中cout、cin和endl的用法

最新推荐文章于 2024-01-30 22:23:50 发布

Lee_Shuai

最新推荐文章于 2024-01-30 22:23:50 发布

阅读量7.3w

收藏

457

点赞数

122

分类专栏:

C++

文章标签:

C++

C++

专栏收录该内容

13 篇文章

11 订阅

订阅专栏

转自:http://blog.csdn.net/zhanghaotian2011/article/details/8868577

转自:http://blog.csdn.net/u011675745/article/details/51939108

转自:http://blog.163.com/ac_victory/blog/static/1033187262008112222553105/

 

对以上三篇文章,我添加了自己已有的部分知识,并重新地汇总整理

转载请注明:http://blog.csdn.Net/lee_shuai

 

输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。

  

C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。

有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:

#include

尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。

一 输入流与输出流的基本操作

cout语句的一般格式为:

cout<<表达式1<<表达式2<<……<<表达式n;

cin语句的一般格式为:

cin>>变量1>>变量2>>……>>变量n;

在定义流对象,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或‘\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。

1.1  cout多行格式

一个cout语句可以分写成若干行。如

cout<<"This is a simple C++ program."<

可以写成

cout<<"This is " //注意行末尾无分号

<<"a C++ "

<<"program."

<

也可写成多个cout语句,即

cout<<"This is "; //语句末尾有分号

cout <<"a C++ ";

cout <<"program.";

cout<

以上3种情况的输出均为

This is a simple C++ program.

注意 不能用一个插入运算符“<<”插入多个输出项,如:

cout<

cout<

作为一项

1.2  cout输出类型

在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则

cout<

会以下面的形式输出:

4 345.789 a

1.3  cin多行格式

与cout类似,一个cin语句可以分写成若干行。如

 cin>>a>>b>>c>>d;

可以写成

cin>>a        //注意行末尾无分号

>>b             //这样写可能看起来清晰些

>>c

>>d;

也可以写成

cin>>a;

cin>>b;

cin>>c;

cin>>d;

以上3种情况均可以从键盘输入: 1  2 3  4 ↙

也可以分多行输入数据:

   1↙

  2  3↙

   4↙

在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有

char c1,c2;

int a;

float b;

cin>>c1>>c2>>a>>b;

如果输入

1234 56.78↙

 注意: 34后面应该有空格以便和56.78分隔开。也可以按下面格式输入:

1 2 34 56.78↙ (在1和2之间有空格)

不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以用3.4.3节介绍的getchar函数。

在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。

二 关于endl的用法

2.1  关于“ ”和’ ’的用法解析

1)       "a"和'a'的区别,前者是字符串,后者是字符。

2)       "\n"是个const char*, 指向一个2字节的区域,调用的是operator <<(const char *); 而'\n'是一个字节的char, 调用的是operator <<(char). 但是性能影响很小,或者可能会被编译器优化掉。

2.2  初级认识

1        在c++中,终端输出换行时,用cout<<......<

2        cout << endl;除了往输出流中插入一个'\n',还有刷新输出流的作用。

cout <

在大的程序中,建议用endl来换行。在没有必要刷新输出流的时候应尽量使用cout <<'\n', 过多的endl是影响程序执行效率低下的因素之一。“\n”与’\n’,在输出上都是表示换行,没有区别

2.3  深层解析

我们在最初学习C++语言时就接触到"cout<

首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<<“运算符后面,故endl应该是一个参数。其实endl是一个函数名,它是一个"<<"运算符重载函数中的参数,参数类型为函数指针。下面我们看下内部函数实现。

ostream& ostream::operator << ( ostream& (*op)(ostream&))

{

// call the function passed as parameter with this stream as theargument

return (*op) (*this);

}

std::ostream& std::endl (std::ostream& strm)

{

    // write newline

    strm.put('\n');

    // flush the output buffer

    strm.flush();

    // return strm to allowchaining

    return strm;

}

可以看出,运算符重载函数中的函数参数为一个函数指针,其指向一个输入输出均为ostream类引用的函数。而endl正是这样一个函数。所以我们在运行"cout<

endl函数输出一个换行符,并刷新输出缓冲区。

这样我们知道在标准库中endl是作为一个函数实现的,显然我们也可以直接调用这一函数。我们看下面的测试程序:

#include

using namespace std;

int main()

{

cout<

endl(cout);

return 0;

}

其输出为两个空行。”cout<

三 在输入流与输出流中使用控制符

上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。

 

需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

3.1 三个使用控制符的例子

例1:输出双精度数

double a=123.456789012345;对a赋初值

(1) cout<

(2) cout<

(3) cout<

(4) cout<< setiosflags(ios∷fixed);输出:123.456789

(5) cout<

(6) cout<

(7) cout<

 

例2:整数输出的

int b=123456;对b赋初值

(1) cout<

(2) cout<

(3) cout<

(4) cout<

(5) cout<

(6) cout<

 

如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

 

例3: 各行小数点对齐

#include

#include

using namespace std;

int main( )

{

  double a=123.456,b=3.14159,c=-3214.67;

  cout<

  cout<

  cout<

   cout<

  return 0;

}

 

输出如下:

 123.46 (字段宽度为10,右对齐,取两位小数)

3.14

 -3214.67

先统一设置定点形式输出、取两位小数、右对。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。

3.2 六个输入函数用法

学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息;

1.       cin

2.       cin.get()

3.       cin.getline()

4.       getline()

5.       gets()

6.       getchar()

3.2.1  cin>>   

用法1:最基本,也是最常用的用法,输入一个数字:

#include

using namespace std;

main ()

{

int a,b;

cin>>a>>b;

cout<

}

输入:2[回车]3[回车]

输出:5

用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束

#include

using namespace std;

main ()

{

char a[20];

cin>>a;

cout<

}

输入:jkljkljkl

输出:jkljkljkl

输入:jkljkljkljkl       //遇空格结束

输出:jkljkl

3.2.2  cin.get()

用法1: cin.get(字符变量名)可以用来接收字符

#include

using namespace std;

main ()

{

char ch;

ch=cin.get();               //或者cin.get(ch);

cout<

}

输入:jljkljkl

输出:j

用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include

using namespace std;

main ()

{

char a[20];

cin.get(a,20);

cout<

}

输入:jkl jkl jkl

输出:jkl jkl jkl

输入:abcdeabcdeabcdeabcdeabcde(输入25个字符)

输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'\0')

用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足。

这个我还不知道怎么用,知道的前辈请赐教;

3.2.3  cin.getline()  

// 接受一个字符串,可以接收空格并输出

#include

using namespace std;

main ()

{

char m[20];

cin.getline(m,5);

cout<

}

输入:jkljkljkl

输出:jklj

接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;

如果把5改成20:

输入:jkljkljkl

输出:jkljkljkl

输入:jklf fjlsjffjsdklf

输出:jklf fjlsjffjsdklf

//延伸:

//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)

//当第三个参数省略时,系统默认为'\0'

//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk

当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:

#include

#include

using namespace std;

main ()

{

char m[3][20];

for(int i=0;i<3;i++)

{

cout<<"\n请输入第"<

cin.getline(m[i],20);

}

cout<

for(int j=0;j<3;j++)

cout<<"输出m["<

}

请输入第1个字符串:

kskr1

请输入第2个字符串:

kskr2

请输入第3个字符串:

kskr3

输出m[0]的值:kskr1

输出m[1]的值:kskr2

输出m[2]的值:kskr3

3.2.4  getline()

// 接受一个字符串,可以接收空格并输出,需包含“#include

#include

#include

using namespace std;

main ()

{

string str;

getline(cin,str);

cout<

}

输入:jkljkljkl

输出:jkljkljkl

输入:jkljfksldfj jklsjfl

输出:jkljfksldfj jklsjfl

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数

3.2.5  gets()

// 接受一个字符串,可以接收空格并输出,需包含“#include

#include

#include

using namespace std;

main ()

{

char m[20];

gets(m);                      //不能写成m=gets();

cout<

}

输入:jkljkljkl

输出:jkljkljkl

输入:jkl jkl jkl

输出:jkl jkl jkl

类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:

#include

#include

using namespace std;

main ()

{

char m[3][20];

for(int i=0;i<3;i++)

{

cout<<"\n请输入第"<

gets(m[i]);

}

cout<

for(int j=0;j<3;j++)

cout<<"输出m["<

}

请输入第1个字符串:

kskr1

请输入第2个字符串:

kskr2

请输入第3个字符串:

kskr3

输出m[0]的值:kskr1

输出m[1]的值:kskr2

输出m[2]的值:kskr3

自我感觉gets()和cin.getline()的用法很类似,只不过cin.getline()多一个参数罢了;

这里顺带说明一下,对于本文中的这个kskr1,kskr2,kskr3的例子,对于cin>>也可以适用,原因是这里输入的没有空格,如果输入了空格,比如“ks kr jkl[回车]”那么cin就会已经接收到3个字符串,“ks,kr,jkl”;再如“kskr 1[回车]kskr 2[回车]”,那么则接收“kskr,1,kskr”;这不是我们所要的结果!而cin.getline()和gets()因为可以接收空格,所以不会产生这个错误;

3.2.6  getchar()  

//接受一个字符,需包含“#include

#include

#include

using namespace std;

main ()

{

char ch;

ch=getchar();                       //不能写成getchar(ch);

cout<

}

输入:jkljkljkl

输出:j

//getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;

有什么建议可以一起探讨,我的email是

优惠劵

Lee_Shuai

关注

关注

122

点赞

457

收藏

觉得还不错?

一键收藏

知道了

6

评论

C++中cout、cin和endl的用法

转自:http://blog.csdn.net/zhanghaotian2011/article/details/8868577 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。  C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C+

复制链接

扫一扫

专栏目录

c++ 入门——浅析构造函数和析构函数

12-17

前文回顾

本文档环境基于Vscode + GCC + CodeRunner

关于C++的环境搭建请参考下面链接:

https://www.jb51.net/article/186542.htm

由于本人具有C#开发经验,部分相同的知识就不再赘述了。只列一下需要记录的知识。

HelloWorld

cout 代表输出<<

cin 代表输入 >>

endl;代表换行,清空缓冲区。

#include

int main()

{

std::cout << "Helloworld22222222222!" << std::endl;

return 0;

}

RunCode结果如下

C++ cout 与cin的用法

m0_51571900的博客

09-17

590

原因是他输出c地址的字符串,输出d地址的字符串,但是d是个字符它会在d的地址一直往后输出知道输出\0,所以字符g后的内容是不能确定的。count<<(char *)c<

6 条评论

您还未登录,请先

登录

后发表或查看评论

C++特别方便的“懒人”语句,快来学一学:多行输出

最新发布

joe_g12345的博客

01-30

249

作为复制粘贴的追捧者,你一定认为C++实在弱到连多行输出cout都要不停写。看了这篇文章,你才会恍然大悟。

c++编程练习 030:你真的搞清楚为啥 while(cin >> n) 能成立了吗?

01-20

北大程序设计与算法(三)测验题汇总(2020春季)

描述

读入两个整数,输出两个整数 ,直到碰到-1

#include

using namespace std;

class MyCin

{

// 在此处补充你的代码

};

int main()

{

MyCin m;

int n1,n2;

while( m >> n1 >> n2)

cout << n1 << << n2 << endl;

return 0;

}

输入

多组数据,每组一行,是两个整数

输出

对每组数据,原样输出

当碰到输入中出现-1 时,程序结束

输入中保证会有 -1

浅析C++中的函数与指针

12-26

用函数指针变量调用函数

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。

例 求a和b中的大者。

先按一般方法写程序:

#include

using namespace std;

int main()

{

int max(int x,int y); //函数声明

int a,b,m;

cin>>a>>b;

m=max(a,b); //调用函数max,求出最大值,赋给m

cout<<"max="<

return 0;

}

基于C++的动态内存分配和释放

12-22

#include

#include

#include

using namespace std;

int main()

{

cout << "1.动态分配和释放一维数组" << endl;

int n;

cout << "请输入一维数组的大小n=";

cin >> n;

int* point = new int[n];

cout << "已分配大小为" << n << "的一维数组!" << endl;

delete []point;

cout << "已释放该一维数组!" << endl << endl;

cout << "2.对不同情况下的二维数组进行动态内存分配和释放" << endl;

srand((unsigned)time(0));

cout << "2.1 行数已知为 3 的二维数组" << endl;

int *a1[3],b1[3];

cout << "请依次输入该二维数组的列数"<

for (int i = 0; i < 3; i++)

{

cin >> b1[i];

cout<

热门推荐

huashuimaijiu的专栏

06-23

6万+

cout是c++语言的输出符号。endl是程序的结束符。

cout

1.程序实例

int a=2;

int c=3;

int b=(a>c)?2:3;

cout

这样的结果是b为3

cout<<"z:"<

// cout 相当于 printf();是输出函数

cout printf("z:%d\n",z);

cout<

weixin_35750747的博客

12-31

8039

cout 是 C++ 中的输出流,它的作用是向输出设备(通常是屏幕)输出信息。

<< 是流插入运算符,它的作用是将一个值插入到输出流中。

endl 是换行符,它的作用是在输出完当前行后换到下一行。

所以,cout<

例如:

#include

using names...

cout后加/不加endl的区别

pangyou3s的博客

12-06

2419

cout后加/不加endl的区别

C++中cout<<后面加endl什么意思?

m0_64222828的博客

02-27

7266

的意思是 从左往右 ,a>b?//输出 z: 2。cout

【C++入门】输入输出、缺省参数和函数重载

m0_67077469的博客

10-08

2220

C++的输入输出、缺省参数和函数重载的解析

C++ 基本的输入输出cout

07-24

C++ 基本的输入输出

C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。

C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。

#include

using namespace std;

int main( )

{

char str[] = "Hello C++";

cout << "Value of str is : " << str << endl;

}

当上面的代码被编译和执行时,它会产生下列结果:

Value of str is : Hello C++

实例

#include

using namespace std;

int main( )

{

char name[50];

cout << "请输入您的名称: ";

cin >> name

【c++primer第五版】第十一章习题答案

qq_51931826的博客

09-04

660

【c++primer第五版】第十一章习题答案

C++ Primer Plus学习笔记--开始学习(二)

平步青云的博客

09-01

5092

进入C++

C++对大小写敏感,比如:将cout替换成Cout或COUT,都无法通过编译。

C++程序包括的元素:

注释: 由前缀//标识

预处理器编译指令#include

函数头: int main()

编译指令:using namespace

函数体:用{}括起

使用C++的cout工具显示消息的语句

结束main()函数的return语句

main()

int main()...

cout 、cin、endl

m0_61545891的博客

11-07

88

cout -----> c++out c++用来输出数据的函数,或者说在输出流插入字段的函数。endl的作用和\n类似,换行输出,且可以程序刷新输出。c++的输入函数,通过>>将输入的数据插入数据流。

C++中cout,cin,endl

weixin_63249832的博客

09-22

2911

C++中cout,cin,endl

详解让人闹心的C++语句 cout<<“Hello“<<endl;

昊虹AI笔记

03-15

3万+

详解让人闹心的C++语句 cout<<“Hello“<<endl;

c++ cout介绍与实现自己的cout

weixin_30735391的博客

08-11

2799

C++编程语言互换流中的标准输出流,需要iostream支持。读为 "c out([si:‘aʊt]"。

名字

cout

类型

std::ostream

读为

"c out"

本相

std::cout.operator<<()函数

使用范例 听语音

#include

using namespace std;

int main...

C++中的引用

sjp151的博客

04-18

1051

引用的基本使用

作用:给变量起别名

语法:数据类型&别名=原名,代码如下:

int main()

{

int a = 10;

int& b = a;

b = 100;//操作别名和操作原名都是操作同一块内存

cout << a << endl;

cout << b << endl;

return 0;

}

...

c++中cin和cout的用法

06-09

cin和cout是c++中标准输入输出流的对象,分别用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是显示器)输出数据。

cin的常用用法是通过>>运算符从标准输入设备读取数据,例如:

```

int num;

cin >> num; // 从标准输入设备读取一个整数

```

cout的常用用法是通过<<运算符向标准输出设备输出数据,例如:

```

int num = 10;

cout << "The number is: " << num << endl; // 输出 "The number is: 10" 并换行

```

需要注意的是,在使用cin和cout时,需要包含头文件iostream,同时也可以使用命名空间std,例如:

```

#include

using namespace std;

int main() {

int num;

cin >> num;

cout << "The number is: " << num << endl;

return 0;

}

```

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

Lee_Shuai

CSDN认证博客专家

CSDN认证企业博客

码龄9年

暂无认证

2

原创

30万+

周排名

195万+

总排名

19万+

访问

等级

1280

积分

87

粉丝

214

获赞

35

评论

747

收藏

私信

关注

热门文章

C++中cout、cin和endl的用法

73140

C++中void和void*指针的含义

24507

C/C++ typedef用法详解(真的很详细)

19211

LVQ学习向量量化神经网络

16908

遗传算法原理+程序案例详解

16541

分类专栏

FPGA仿真

1篇

bp神经网络

2篇

数学

3篇

傅里叶变换

1篇

欧拉公式

1篇

复数

1篇

遗传算法

1篇

matlab

1篇

C++

13篇

内存对齐

1篇

指针

1篇

adaboost

1篇

opencv

1篇

1篇

tensorflow

1篇

最新评论

C++中cout、cin和endl的用法

Hgghgr:

cin>>的用法二为什么不像次年。cin.get一样考虑数组长度问题,并且char a[20]我输入大于19个字母,能够运行,且逐一输出没有越界,且sizeof没有变化

C/C++ typedef用法详解(真的很详细)

牧羊人12138:

哇~真的很详细

matlab中神经网络工具箱函数汇总

m0_71789798:

博主是否还可以讲解一下训练函数和学习规则的区别

matlab中神经网络工具箱函数汇总

只想摸鱼的小白:

楼主,matlab中神经网络工具箱的默认激活函数是啥啊

C++中cout、cin和endl的用法

万 俟:

大佬!赞!!!!!!!!!!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

十个主题,很全面的有关 TensorFlow 的实践 、库和项目的列表

Opencv研读笔记:haartraining程序之莫名其妙的条件宏ICV_DEF_FIND_STUMP_THRESHOLD_SQ解释~

数据结构的内存分配、对齐,及指针加1的含义

2017年5篇

2016年15篇

目录

目录

分类专栏

FPGA仿真

1篇

bp神经网络

2篇

数学

3篇

傅里叶变换

1篇

欧拉公式

1篇

复数

1篇

遗传算法

1篇

matlab

1篇

C++

13篇

内存对齐

1篇

指针

1篇

adaboost

1篇

opencv

1篇

1篇

tensorflow

1篇

目录

评论 6

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

【C++ 基础知识】进一步了解 C++ 中 操纵符std::endl 的原理 - 知乎

【C++ 基础知识】进一步了解 C++ 中 操纵符std::endl 的原理 - 知乎首发于C/C++ 编程技术切换模式写文章登录/注册【C++ 基础知识】进一步了解 C++ 中 操纵符std::endl 的原理泡沫o0​​英纳法智联科技(北京)有限公司上海分公司 员工第一章: std::endl 的原理与使用 (The Principles and Usage of std::endl)在C++编程中,std::endl 是一个我们经常遇到的概念,它的作用似乎非常直观——在输出流中插入换行符,并刷新输出缓冲区。但是,std::endl 背后的设计却反映出C++语言的深刻内涵:类型安全、泛型编程和性能优化。本章将深入探讨 std::endl 的机制,以及为何它不仅仅是简单的换行符。1.1 探索 std::endl (Exploring std::endl)1.1.1 概念与作用 (Concept and Functionality)std::endl 是标准模板库(Standard Template Library, STL)中定义的一个操纵符,它有两个基本作用:插入换行符(\n)到输出流,并且刷新该流,确保所有待处理的输出都被写入到目的地。这个操纵符的行为似乎简单明了,但是其设计背后蕴含的C++哲学远不止于此。在C++中,std::endl 是模板函数的一个实例。其模板参数推导是基于它被用于哪种类型的流(stream)对象。当你使用 std::endl 与一个输出流对象一起,如 std::cout,编译器会自动推导 std::endl 的模板参数,使其匹配该输出流的字符类型和特征。std::cout 是 std::ostream 类型的对象,而 std::ostream 是 std::basic_ostream> 的一个特化。因此,当你写下:std::cout << std::endl;

编译器看到 std::endl 应用于 std::ostream 类型的对象(std::cout),它会推导出 std::endl 应用的正确的模板参数为 char 和 std::char_traits。这意味着 std::endl 实际上是 std::endl> 的一个简写。这个推导过程是基于模板参数匹配的规则。模板参数匹配是C++模板元编程的一个核心概念,它允许函数模板根据提供给它们的参数类型自动选择最合适的模板实例。下面是 std::endl 函数模板的简化声明:template

std::basic_ostream& endl(std::basic_ostream& os);

当你调用 endl 时,编译器会查看 endl 的参数——这里是流对象 os——并使用这个流对象的类型来推导 endl 的模板参数。因为 std::cout 是 std::basic_ostream> 类型的,所以 CharT 推导为 char,Traits 推导为 std::char_traits。这个过程发生在编译时,而不是运行时。它允许函数模板根据它们用于的上下文自动调整它们的行为,而无需程序员显式指定每个模板参数。1.1.2 为什么 std::endl 是模板 (Why std::endl is a Template)std::endl 主要用来在输出流中插入换行符并刷新流。在很多情况下,直接写入换行字符(例如 '\n')和显式刷新流(例如使用 std::flush)也能达到相同的效果。然而,std::endl 是设计为模板的原因包括:泛型编程:C++的标准库广泛使用模板来实现泛型编程。std::endl 作为模板的一部分,可以确保它能够与所有的基本输出流(basic_ostream)类型一起工作,无论它们使用的字符类型是什么。这包括常见的 char 类型(std::ostream),也包括宽字符类型 wchar_t(std::wostream)。 类型安全:模板允许在编译时进行类型检查。如果 std::endl 不是模板,那么它可能无法正确地与所有类型的流一起工作,特别是当涉及到用户自定义的流类型时。 一致性和可扩展性:通过将 std::endl 设计为模板,它与其他输入/输出流操纵器(如 std::setprecision, std::setw 等)保持了一致的接口。这意味着 std::endl 可以像其他操纵器一样在表达式中链式使用,并且可以很容易地与用户定义的操纵器一起工作。 性能优化:使用模板,编译器有机会在编译时对 std::endl 的使用进行优化,这在某些情况下可能会比手动写入换行和刷新更高效。 兼容不同环境:在某些系统中,行结束符可能不仅仅是 '\n'。使用 std::endl 确保会插入正确的行结束符并根据流的类型刷新它。 简而言之,模板使得 std::endl 成为了一个灵活、安全和强大的工具,它可以在各种流操作中无缝工作,同时为C++标准库的设计提供了一致性。即使在很多情况下,直接写入换行符和刷新流是可以的,std::endl 提供了一个类型安全和自我说明的方式来处理流的结束和换行,这与C++的泛型编程和类型安全的设计哲学是一致的。1.1.3 模板参数推导 (Template Argument Deduction)当我们使用 std::endl 时,编译器会自动推导出其模板参数。这是基于它被用于哪种类型的流对象。例如,当 std::endl 被用于 std::cout 时,编译器推导其字符类型为 char,特性为 std::char_traits。这种自动推导省去了程序员显式指定模板参数的麻烦,同时也保证了代码的类型安全。1.2 std::endl 与 '\n' 的区别 (The Difference Between std::endl and '\n')许多新手程序员在最初学习C++时会疑惑,为什么要使用 std::endl 而不是直接输出换行符 '\n'。事实上,两者在功能上有细微的差别,而这种设计反映出C++对性能的考量。1.2.1 换行符与刷新流 (Newline Character and Flushing the Stream)直接写入换行符 '\n' 只会在输出流中插入换行,而不会引发缓冲区的刷新。这在大量数据需要连续写入时可能更高效,因为减少了刷新次数。相反,std::endl 在插入换行符后会强制刷新流,这确保了所有的输出都立即被处理,但第二章: C++中的类型安全和泛型编程 (Type Safety and Generic Programming in C++)在C++的世界中,类型安全和泛型编程是两个核心概念,它们确保了代码的健壮性和灵活性。通过探索这些概念,我们可以更好地理解 std::endl 作为模板的设计意图以及它在C++标准库中的作用。2.1 类型安全的重要性 (The Importance of Type Safety)2.1.1 定义与优势 (Definition and Advantages)类型安全是指在编程语言中对类型的严格检查,以防止类型错误。这个概念在C++中尤为重要,因为它能够防止许多常见的编程错误,如类型不匹配、内存越界访问等。类型安全的代码更加可靠,因为它能够在编译时而不是运行时捕获错误,这样可以减少程序崩溃的风险并提高代码质量。2.1.2 类型安全与 std::endl (Type Safety and std::endl)std::endl 作为模板,意味着它在使用时会进行类型检查。这保证了只有合适的流对象才能使用 std::endl,从而避免了类型不匹配的错误。类型安全在这里发挥了作用,使得 std::endl 能够安全地与任何类型的 std::basic_ostream 对象一起使用。2.2 泛型编程的理念 (The Philosophy of Generic Programming)2.2.1 泛型编程简介 (Introduction to Generic Programming)泛型编程是一种软件工程的范式,旨在编写独立于特定数据类型的代码。C++的模板是实现泛型编程的一种强大工具,允许开发者编写可重用的代码库,这些代码库能够与任何类型协同工作。2.2.2 模板与代码重用 (Templates and Code Reusability)模板增强了代码的重用性。例如,标准模板库(STL)中的容器和算法就广泛使用了模板。这使得同一个算法可以用于不同类型的容器,而无需为每种类型重写代码。std::endl 也是这一理念的体现,它可以被用于任何类型的输出流。2.2.3 泛型编程与 std::endl (Generic Programming and std::endl)std::endl 体现了泛型编程的理念,它是为所有类型的 basic_ostream 类模板实例设计的。这意味着无论是使用标准字符流(如 std::cout)还是宽字符流(如 std::wcout),std::endl 都能够提供一致的功能。这种设计不仅仅是为了灵活性,也是为了确保在不同上下文中的正确性和效率。第三章: 实现自定义的 std::endl (Implementing a Custom std::endl)在C++中实现自己的 std::endl 版本是一个很好的练习,它不仅可以帮助我们深入理解 std::endl 的工作原理,还能加深我们对C++模板和流操作的理解。本章将讨论如何实现一个自定义的 std::endl,并提供示例代码。3.1 自定义操纵符的设计理念 (Design Philosophy of Custom Manipulators)3.1.1 操纵符的作用 (The Role of Manipulators)操纵符是用于格式化和控制输入/输出流的函数或对象。在实现自定义的 std::endl 时,我们的目标是创建一个操纵符,它不仅能够在流中插入一个换行符,而且还能刷新该流,正如标准的 std::endl 所做的那样。3.1.2 函数操纵符与对象操纵符 (Function Manipulators vs. Object Manipulators)在C++中,操纵符可以是函数也可以是对象。我们将通过函数操纵符的方式来实现自定义的 std::endl,因为它允许我们直接插入特定的行为到流中。3.2 实现自定义 endl 的步骤 (Steps to Implement a Custom endl)3.2.1 定义函数模板 (Defining the Function Template)我们首先需要定义一个函数模板,它可以接受任何基本输出流的引用。这个模板将负责向流中插入换行符并刷新它。3.2.2 函数模板的实现 (Implementing the Function Template)函数模板的实现将包含两个操作:向流中插入换行符和刷新流。这可以通过流的插入操作符 (<<) 实现。3.3 示例代码 (Sample Code)#include

#include

// Forward declaration for the template function

template

std::basic_ostream& custom_endl(std::basic_ostream& os);

// Define a manipulator class that will call the custom_endl function

template

class CustomEndlClass {

public:

// Overload the function call operator

void operator()(std::basic_ostream& os) const {

custom_endl(os);

}

};

// The actual function that performs the endline and flush operation

template

std::basic_ostream& custom_endl(std::basic_ostream& os) {

// Insert a newline character

os.put(os.widen('\n'));

// Flush the stream

os.flush();

return os;

}

// Overload the << operator to accept the custom endl manipulator

template

std::basic_ostream& operator<<(std::basic_ostream& os,

const CustomEndlClass& manip) {

// Call the function call operator of the manipulator class

manip(os);

return os;

}

// Create a manipulator object

const CustomEndlClass> custom_endl_obj;

int main() {

// Use the custom endl manipulator

std::cout << "This is a line of text" << custom_endl_obj;

std::cout << "This is another line of text" << custom_endl_obj;

return 0;

}

在这个更复杂的例子中,我们创建了一个名为 CustomEndlClass 的操纵符类,该类重载了函数调用操作符 operator(),使其可以像函数一样被调用。然后我们为这个类重载了流的插入操作符 operator<<,这样它就可以被用在 std::basic_ostream 类型的流对象上。为了使用这个自定义的 endl,我们创建了一个 custom_endl_obj 的对象。这个对象被设计为可以被插入到任何 std::basic_ostream 类型的流中,它会自动调用 custom_endl 函数来插入换行符并刷新流。这种方法的优点是它提供了与 std::endl 完全相同的灵活性,同时还允许你对操纵符的行为进行更多的控制和扩展。例如,你可以为这个类添加额外的方法来控制换行符后是否进行刷新,或者添加其他类型的操作。 结语 在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。发布于 2024-02-18 15:40・IP 属地上海C++C / C++Modern C++​赞同​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录C/C++ 编

endl_百度百科

_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10endl播报讨论上传视频C++标准库中的操控器endl,是C++标准库中的操控器(Manipulator),包含于,命名空间(namespace):std,其主要搭配iostream对象来使用,如cout、cerr等等。外文名endl性    质C++程序语言意    思一行输出结束,然后输出下一行全    称end of line目录1基本信息2作用3示例▪例一▪例二基本信息播报编辑endl英语意思是end of line,即一行输出结束,然后输出下一行。endl与cout搭配使用,意思是输出结束。按C++标准程序库中的描述其实现如下:template 

basic_ostream& endl (basic_ostream& os);可见endl只是一个函数模板。作用播报编辑1.将换行符写入输出流,并将与设备关联的缓冲区的内容刷到设备中,保证目前为止程序所暂存的所有输出都真正写入输出流。 [1]其中Unix/Linux换行符是\n,Windows中是\r\n,MAC中是\r;2.清空输出缓冲区。示例播报编辑例一在语句 :cout<<"the id is"<

cout<<"the id is"<<2 << endl;中,endl就相当于输出的时候回车。第一句的输出是:the id is

2第二句的输出是:the id is 2然后光标到了第二行。例二额外的,还可以这样使用endl:std::endl(cout); // 等于 std::endl(std::cout);

std::endl(cout << "this id is" << 2); // 等于 std::endl(std::cout << "this id is" << 2);(注:这是由于Koenig lookup法则)其中第一句等同于:std::cout << std::endl; // 不能写成std::cout << endl;第二句等于:std::cout << "this id is" << 2 << std::endl;//如上所述新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

Cout<<"hello"<

Cout<<"hello"< >& __CLRCALL_OR_CDECL endl(basic_ostream >& _Ostr) { // insert newline and flush byte stream _Ostr.put('\n');//换行 _Ostr.flush();//刷新缓冲 return (_Ostr); }由此可见endl的确是起到换行和刷新的作用。至于为什么不刷新也会显示是因为缓冲区满足一定条件后会自动刷新(缓冲区满,长时间没输入等)。调用flush只不过是人为的强制它在此时执行。发布于 2012-06-02 09:19​赞同 6​​4 条评论​分享​收藏​喜欢收起​陈良乔义务的C/C++初学者辅导 ​ 关注符闯的回答,前半截是正确的,cout<<"hello";将这个字符串写入输出流对象cout对endl的理解有一点点问题由于cout会对输出的内容进行缓冲,所以输出的内容并不会立即输出到目标设备(显示器)而是被存储在缓冲区中,直到缓冲区填满才输出。然而,我们可以在缓冲区没有满的时候,手动地刷新缓冲区以实现输出有两种方式,一种是向cout输出一个flush操作符,一种是向cout输出一个endl操作符flush只是刷新缓冲区而endl不仅刷新缓冲区,还加入了一个换行符,endl = end line例如:cout<<"hello"<c++中endl操作符以及它的兄弟们 - 知乎

c++中endl操作符以及它的兄弟们 - 知乎首发于cpp加油站切换模式写文章登录/注册c++中endl操作符以及它的兄弟们CPP加油站 说明一下,我用的是g++7.1.0编译器,标准库源代码也是这个版本的。 一直以来,我们每次使用cout输出数据的时候,如果要换行,都知道使用形如cout << endl;这样的形式,那么endl到底是什么呢,它是怎么样实现输出一个换行符的功能的,以前我没有思考过,但现在我想弄懂它,下面就一起看一下吧。1.endl操作符的实现在标准库头文件中,我找到了endl的操作符重载函数,如下:template

inline basic_ostream<_CharT, _Traits>&

endl(basic_ostream<_CharT, _Traits>& __os)

{ return flush(__os.put(__os.widen('\n'))); }

它是一个内联的函数模板,是一个全局的函数模板,endl正是它的函数名,它的作用是往缓冲区写入一个换行符并且立即从缓冲区刷新到外部设备中。那么endl是怎么与<<操作符关联起来的呢,我们在ostream头文件ostream类的声明中又发现了以下代码:__ostream_type&

operator<<(__ostream_type& (*__pf)(__ostream_type&))

{

// _GLIBCXX_RESOLVE_LIB_DEFECTS

// DR 60. What is a formatted input function?

// The inserters for manipulators are *not* formatted output functions.

return __pf(*this);

}

这个操作符的入参是一个__ostream_type& (*__pf)(__ostream_type&)类型的函数指针,这个类型与endl的类型是一致的,从而,我们现在知道了endl的实现过程。与endl同样实现的总共是亲兄弟三个,他们类型一样,且都是对缓冲区进行操作,如下:2. 格式化操作符说完endl的亲兄弟,接下来说一说它的堂兄弟们,那就是格式化操作符,在某些书籍上也叫做操纵算子,操纵算子用法与endl一样,也是形如cout << oct这样的形式,但它不会对缓冲区直接进行操作,它是对后续的数据输出进行格式化,类似c语言的%d一样,且操纵算子的实现方式与endl类似,只是<<的返回类型与参数类型不一样而已,这里就不再多说。操纵算子分为两类,一类是无参的,定义在ios_base.h头文件中,还有一类是有参的,定义在iomanip头文件中。2.1 无参操纵算子一个使用案例如下:#include

using namespace std;

int main()

{

// Initializing the integer

double x = 10.2333336;

//将浮点数x以十六进制形式输出,且字母都为大写

cout << uppercase << hexfloat << x << endl;

cout.width(12);

double y = -11.222;

//取消指定的浮点数格式,按默认格式输出

cout << defaultfloat;

//符号左对齐,数值右对齐,中间填充空格

cout << internal << y << endl;

return 0;

}

输出结果如下:0X1.47777806A1DABP+3

- 11.2222.2 有参操纵算子有参的操纵算子实际上是在无参的基础上实现的,是对无参操纵算子的补充,且对无参操纵算子的使用起到了简化的作用。首先还是看一看有参操纵算子有哪些,如下:带参数的这些操作函数,前面6个其实是比较好理解的,但是后面四个用起来就比较麻烦了,而且单独使用也是不起作用的,下面我们就后面四个操作符,看一下使用案例,如下:#include

#include

#include

#include

using namespace std;

void test01()

{

locale loc_de = locale("en_US.utf-8");

cout.imbue(loc_de);

const string str("720000000000");

cout << put_money(str) << endl;

string str2;

cin.imbue(loc_de);

cin >> get_money(str2);//这里要按照imbue设置的区域和编码进行输入,形如:72,000,000

cout << "str2=" << str2 << endl;

time_t t;

time(&t);

tm *tmp = localtime(&t);

cout << put_time(tmp, "%y %a") << endl;

tm time1;

istringstream iss("15:12:00 2021");

iss >> get_time(&time1, "%H:%M:%S %Y");

cout << "hour:" << time1.tm_hour << ',' << "min:" << time1.tm_min << ',' << "sec:" << time1.tm_sec << endl;

}

int main()

{

test01();

return 0;

}

输出显示如下:[root@mylinux ~]# ./a.out

7,200,000,000.00

12,00,00 #注意这里是屏幕输入的

str2=120000

21 Thu

hour:15,min:12,sec:0

[root@mylinux ~]# 后面四个函数的使用就涉及到程序国际化以及区域文化的问题,比如浮点数,在我们大中国是72000.12,那么到了美国可能又是用72,000.12来表示,关于区域文化,这里就不展开说明了。发布于 2021-04-30 09:26C / C++C++标准程序库(书籍)iostream​赞同 5​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录cpp加油站c++

std::endl - cppreference.com

std::endl - cppreference.com

cppreference.com

Log in

Namespaces

Page

Discussion

Variants

Views

View

Edit

History

Actions

std::endl

From cppreference.com

< cpp‎ | io‎ | manip

 C++

Compiler support

Freestanding and hosted

Language

Standard library

Standard library headers

Named requirements

Feature test macros (C++20)

Language support library

Concepts library (C++20)

Metaprogramming library (C++11)

Diagnostics library

General utilities library

Strings library

Containers library

Iterators library

Ranges library (C++20)

Algorithms library

Numerics library

Localizations library

Input/output library

Filesystem library (C++17)

Regular expressions library (C++11)

Concurrency support library (C++11)

Technical specifications

Symbols index

External libraries

[edit] Input/output library

I/O manipulators

Print functions (C++23)

C-style I/O

Buffers

basic_streambuf

basic_filebuf

basic_stringbuf

basic_spanbuf(C++23)

strstreambuf(deprecated in C++98)

basic_syncbuf(C++20)

Streams

Abstractions

ios_base

basic_ios

basic_istream

basic_ostream

basic_iostream

File I/O

basic_ifstream

basic_ofstream

basic_fstream

String I/O

basic_istringstream

basic_ostringstream

basic_stringstream

Array I/O

basic_ispanstream(C++23)

basic_ospanstream(C++23)

basic_spanstream(C++23)

istrstream(deprecated in C++98)

ostrstream(deprecated in C++98)

strstream(deprecated in C++98)

Synchronized Output

basic_osyncstream(C++20)

Types

streamoff

streamsize

fpos

Error category interface

iostream_category(C++11)

io_errc(C++11)

[edit] Input/output manipulators

Floating-point formatting

showpointnoshowpoint

setprecision

fixedscientifichexfloatdefaultfloat(C++11)(C++11)

Integer formatting

setbase

showbasenoshowbase

dechexoct

Boolean formatting

boolalphanoboolalpha

Field width and fill control

setfill

setw

internalleftright

Other formatting

showposnoshowpos

uppercasenouppercase

Whitespace processing

ws

ends

skipwsnoskipws

Output flushing

flush

endl

flush_emit(C++20)  

unitbufnounitbuf

emit_on_flushnoemit_on_flush(C++20)(C++20)

Status flags manipulation

resetiosflags

setiosflags

Time and money I/O

get_money(C++11)

get_time(C++11)

put_money(C++11)

put_time(C++11)

Quoted manipulator

quoted(C++14)

[edit] 

Defined in header

template< class CharT, class Traits >

std::basic_ostream& endl( std::basic_ostream& os );

Inserts a newline character into the output sequence os and flushes it as if by calling os.put(os.widen('\n')) followed by os.flush().

This is an output-only I/O manipulator, it may be called with an expression such as out << std::endl for any out of type std::basic_ostream.

Contents

1 Notes

2 Parameters

3 Return value

4 Example

5 See also

[edit] Notes

This manipulator may be used to produce a line of output immediately, e.g. when displaying output from a long-running process, logging activity of multiple threads or logging activity of a program that may crash unexpectedly. An explicit flush of std::cout is also necessary before a call to std::system, if the spawned process performs any screen I/O. In most other usual interactive I/O scenarios, std::endl is redundant when used with std::cout because any input from std::cin, output to std::cerr, or program termination forces a call to std::cout.flush(). Use of std::endl in place of '\n', encouraged by some sources, may significantly degrade output performance.

In many implementations, standard output is line-buffered, and writing '\n' causes a flush anyway, unless std::ios::sync_with_stdio(false) was executed. In those situations, unnecessary endl only degrades the performance of file output, not standard output.

The code samples on this wiki follow Bjarne Stroustrup and The C++ Core Guidelines in flushing the standard output only where necessary.

When an incomplete line of output needs to be flushed, the std::flush manipulator may be used.

When every character of output needs to be flushed, the std::unitbuf manipulator may be used.

[edit] Parameters

os

-

reference to output stream

[edit] Return value

os (reference to the stream after manipulation).

[edit] Example

With '\n' instead of endl, the output would be the same, but may not appear in real time.Run this code

#include

#include

 

template

void log_progress(Diff d)

{

std::cout << std::chrono::duration_cast(d)

<< " passed" << std::endl;

}

 

int main()

{

std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n

 

static volatile int sink{};

const auto t1 = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 5; ++i)

{

for (int j = 0; j < 10000; ++j)

for (int k = 0; k < 20000; ++k)

sink += i * j * k; // do some work

log_progress(std::chrono::high_resolution_clock::now() - t1);

}

}

Possible output:

566ms passed

1133ms passed

1699ms passed

2262ms passed

2829ms passed

[edit] See also

unitbufnounitbuf

controls whether output is flushed after each operation (function) [edit]

flush

flushes the output stream (function template) [edit]

flush

synchronizes with the underlying storage device (public member function of std::basic_ostream) [edit]

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/io/manip/endl&oldid=159531"

Navigation

Support usRecent changesFAQOffline version

Toolbox

What links hereRelated changesUpload fileSpecial pagesPrintable versionPermanent linkPage information

In other languages

DeutschEspañolFrançaisItaliano日本語PortuguêsРусский中文

This page was last modified on 23 September 2023, at 16:43.

This page has been accessed 376,032 times.

Privacy policy

About cppreference.com

Disclaimers

std::endl - C++中文 - API参考文档

std::endl - C++中文 - API参考文档

API Reference Document

std::endl

< cpp‎ | io‎ | manip

  C++

语言

标准库头文件

自立与有宿主实现

具名要求

语言支持库

概念库 (C++20)

诊断库

工具库

字符串库

容器库

迭代器库

范围库 (C++20)

算法库

数值库

本地化库

输入/输出库

文件系统库 (C++17)

正则表达式库 (C++11)

原子操作库 (C++11)

线程支持库 (C++11)

技术规范

 输入/输出库

I/O 操纵符

C 风格 I/O

缓冲

basic_streambuf

basic_filebuf

basic_stringbuf

strstreambuf(C++98 中弃用)

basic_syncbuf(C++20)

抽象

ios_base

basic_ios

basic_istream

basic_ostream

basic_iostream

文件 I/O

basic_ifstream

basic_ofstream

basic_fstream

字符串 I/O

basic_istringstream

basic_ostringstream

basic_stringstream

数组 I/O

istrstream(C++98 中弃用)

ostrstream(C++98 中弃用)

strstream(C++98 中弃用)

同步的输出

basic_osyncstream(C++20)

类型

streamoff

streamsize

fpos

错误类别接口

iostream_category(C++11)

io_errc(C++11)

 输入/输出操纵符

浮点格式化

showpointnoshowpoint

setprecision

fixedscientifichexfloatdefaultfloat(C++11)(C++11)

整数格式化

setbase

showbasenoshowbase

dechexoct

布尔格式化

boolalphanoboolalpha

域宽与填充控制

setfill

setw

internalleftright

其他格式化

showposnoshowpos

uppercasenouppercase

空白符处理

ws

ends

skipwsnoskipws

输出冲入

flush

endl

flush_emit(C++20)

unitbufnounitbuf

emit_on_flushno_emit_on_flush(C++20)(C++20)

状态标志操纵

resetiosflags

setiosflags

时间与金钱 I/O

get_money(C++11)

get_time(C++11)

put_money(C++11)

put_time(C++11)

带引号操纵符

quoted(C++14)

 

定义于头文件

template< class CharT, class Traits >

std::basic_ostream& endl( std::basic_ostream& os );

插入换行符到输出序列 os 并冲入它,如同调用 os.put(os.widen('\n')) 后随 os.flush() 。

这是仅输出的 I/O 操纵符,可对任何 std::basic_ostream 类型的 out 以表达式 out << std::endl 调用它。

注意

可用此操纵符立即产生新行的输出,例如在从长时间运行的进程显示输出、记录多个线程的活动或记录可能不期待地崩溃的程序活动时。在调用 std::system 前亦需要 std::cout 的显式冲入,若产生的进程进行任何屏幕 I/O 。多数其他通常的交互 I/O 场景中,使用 std::cout 时 std::endl 是冗余的,因为任何来自 std::cin 的输入、到 std::cerr 的输出或程序终止强制调用 std::cout.flush() 。某些源代码中鼓励用 std::endl 代替 '\n' ,这可能显著地降低输出性能。

多数实现中,标准输出是行缓冲的,而写入 '\n' 就会导致冲入,除非执行 std::ios::sync_with_stdio(false) 。这些情形中,不必要的 endl 只会降低文件输出的性能,而非标准输出的。

此维基上的代码示例遵循 Bjarne Stroustrup和《 C++ 核心方针》,只在需要时冲入标准输出。

需要冲入不完整的行时,可使用 std::flush 操纵符。

需要冲入每个字节的输出时,可使用 std::unitbuf 操纵符。

参数

os

-

到输出流的引用

返回值

os (到操纵后流的引用)

示例

以 \n 替代 endl ,输出会相同,但可能不会实时出现。运行此代码

#include

#include

 

template

void log_progress(Diff d)

{

std::cout << std::chrono::duration_cast(d).count()

<< " ms passed" << std::endl;

}

 

int main()

{

std::cout.sync_with_stdio(false); // 一些平台上 stdout 在写 \n 时冲入

volatile int sink = 0;

 

auto t1 = std::chrono::high_resolution_clock::now();

for (int j=0; j<5; ++j)

{

for (int n=0; n<10000; ++n)

for (int m=0; m<20000; ++m)

sink += m*n; // 做一些工作

auto now = std::chrono::high_resolution_clock::now();

log_progress(now - t1);

}

}

可能的输出:

487 ms passed

974 ms passed

1470 ms passed

1965 ms passed

2455 ms passed

参阅

unitbufnounitbuf

控制是否每次操作后冲洗输出 (函数)

flush

冲洗输出流 (函数模板)

flush

与底层存储设备同步 (std::basic_ostream 的公开成员函数)

cplusplus.com

TUTORIALS

REFERENCE

ARTICLES

FORUM

C++

TutorialsReferenceArticlesForum

Reference

C library:

(assert.h)

(ctype.h)

(errno.h)

C++11

(fenv.h)

(float.h)

C++11

(inttypes.h)

(iso646.h)

(limits.h)

(locale.h)

(math.h)

(setjmp.h)

(signal.h)

(stdarg.h)

C++11

(stdbool.h)

(stddef.h)

C++11

(stdint.h)

(stdio.h)

(stdlib.h)

(string.h)

C++11

(tgmath.h)

(time.h)

C++11

(uchar.h)

(wchar.h)

(wctype.h)

Containers:

C++11

C++11

C++11

C++11

Input/Output:

Multi-threading:

C++11

C++11

C++11

C++11

C++11

Other:

C++11

C++11

C++11

C++11

C++11

C++11

C++11

C++11

C++11

C++11

class templates

basic_ostream

classes

ostream

wostream

manipulators

endl

ends

flush

Reference

endl

function

std::endl

for ostreamostream& endl (ostream& os);basic templatetemplate basic_ostream& endl (basic_ostream& os);

Insert newline and flush

Inserts a new-line character and flushes the stream.

Its behavior is equivalent to calling os.put('\n') (or os.put(os.widen('\n')) for character types other than char), and then os.flush().

Parameters

os

Output stream object affected.

Because this function is a manipulator, it is designed to be used alone with no arguments in conjunction with the insertion (<<) operations on output streams (see example below).

Return Value

Argument os.

Errors are signaled by modifying the internal state flags of os:

flagerror

eofbit-

failbitMay be set if the construction of a sentry object failed.

badbitEither the insertion on the stream (or the synchronization) failed, or some other error happened (such as when this function catches an exception thrown by an internal operation).

When set, the integrity of the stream may have been affected.

Multiple flags may be set on os by a single operation.

If the operation sets an internal state flag of os that was registered using its member exceptions, the function throws an exception of type ios_base::failure.

Example

123456789101112131415

// endl example

#include // std::cout, std::end

int main () {

int a=100;

double b=3.14;

std::cout << a;

std::cout << std::endl; // manipulator inserted alone

std::cout << b << std::endl << a*b; // manipulator in concatenated insertion

std::endl (std::cout); // endl called as a regular function

return 0;

}

Output:

100

3.14

314

Data races

Modifies os.

Concurrent access to the same stream object may cause data races, except for the standard stream objects (cout, cerr, clog, wcout, wcerr and wclog) when these are synchronized with stdio (in this case, no data races are initiated, although no guarantees are given on the order in which characters from multiple threads are inserted).

Exception safety

Basic guarantee: if an exception is thrown, os is in a valid state.

It throws an exception of member type failure if the resulting error state flag of os is not goodbit and member exceptions was set to throw for that state.

Any exception thrown by an internal operation is caught and handled by the function, setting os's badbit. If badbit was set on the last call to exceptions for os, the function rethrows the caught exception.

See also

flushFlush stream buffer (function)ostream::operator<

Home page | Privacy policy© cplusplus.com, 2000-2023 - All rights reserved - v3.3.4s

Spotted an error? contact us

版权声明:本文由比特派钱包网址发布,如需转载请注明出处。

本文链接:https://www.siyuewuyu.com/article/563.html