C++语言cin和cout的详解

news/2024/11/8 23:04:26/

代码编译运行环境 QT creator

1.cin和cout简介

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

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

#include<iostream>

using namespace std;

根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。

2.cin和cout的基本操作

cout语句的一般格式为:

cout<<表达式1<<表达式2<<表达式3...<<表达式n;

cin语句的一般格式为:

cin>>变量1>>变量2>>变量3>>.....>>变量n;

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

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

1)cout<<"this is a simple c++."<<endl;

2)cout<<"this is"  //注意没有分号

<<"a C++"

<<"program."

<<endl;

3)cout<<"this is ";   //有分号

cout<<"a C++";

cout<<"program.";

cout<<endl;

输出结果差不多。

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

cout<<a,b,c; //错误,不能一次插入多项cout<<a+b+c; //正确,这是一个表达式,作为一项

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

输出结果为:4  3.14  a

cin:与cout类似,cin语句可以分成若干行

1)cin>>a>>b>>c>>d;

2)cin>>a  //这样的写法比较清晰

>>b

>>c

>>d;

3)cin>>a;

cin>>b;

cin>>c;

从键盘输入的结果都一样:1 enter键 23 enter键 4

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

char c1,c2;int a;float b;
cin>>c1>>c2>>a>>b;

不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,他们将被跳过。

3.cin的常用读取方法

使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。

3.1cin>>的用法

cin可以连续从键盘读取想要的数据,以空格、enter或换行作为分隔符。

#include <iostream>

usingnamespacestd;

int main()

{  

char a;  

int b;  

float c;  

string  

cin>>a>>b>>c;  

cout<<a<<" "<<b<<" "<<c<<" "<<endl;  

system("pause");  

return0;

}

在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果: 
这里写图片描述

注意: 
(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。 
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。 
(3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;

#include <string> 
#include <iostream>
using namespace std;int main()
{char a;int b;float c;string str;cin>>a>>b>>c>>str;cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;string test;getline(cin,test);//不阻塞cout<<"test:"<<test<<endl;system("pause");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是: 
这里写图片描述

从结果可以看出,cin>>对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’,因此程序中的test为空串。


http://www.ppmy.cn/news/335136.html

相关文章

DCGAN

转自&#xff1a;https://blog.csdn.net/liuxiao214/article/details/74502975 首先是各种参考博客、链接等&#xff0c;表示感谢。 1、参考博客1&#xff1a;地址 ——以下&#xff0c;开始正文。 2017/12/12 更新 解决训练不收敛的问题。 更新在最后面部分。 1、DCGAN的…

dilation conv 和 deconv

最近工作要用到dilation conv&#xff0c;在此总结一下空洞卷积&#xff0c;并和deconv进行对比。 dilation conv 首先空洞卷积的目的是为了在扩大感受野的同时&#xff0c;不降低图片分辨率和不引入额外参数及计算量&#xff08;一般在CNN中扩大感受野都需要使用s>1的con…

【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一、加载 UEFI 默认应用程序1.1 LaunchDefaultBDSApps()1.1 LaunchAppFromGuidedFv() 二、QcomChargerApp应用程序初始化2.1 入口函数 QcomChargerApp_Entry()2.2 充电初始化 QcomChargerApp_Initia…

nvidia驱动,cuda与cudnn的关系

一关系阐述&#xff1a; &#xff08;1&#xff09;NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦&#xff01;CUDA是NVIDIA推出的用于自家GPU的并行计算框架&#xff0c;也就是说CUDA只能在NVIDIA的GPU上运行&#xff0c;而且只有当要解决的计算问题是可以大量并行计算的…

cin、cout的使用

cin、cout的使用 基本内容&#xff1a; (1)有关流对象cin、cout和流运算符的定义等信息是存放在C的输入输出流库中的&#xff0c;因此在程序中使用cin、cout和流运算符&#xff0c;就必须使用预处理命令把头文件stream包含到本文件中. 示教&#xff1a;#include <iostream…

DCC:Deep continuous clustering

文章&#xff1a;NIPS’17 代码&#xff1a;TensorFlow实现&#xff1b;Pytorch实现 经典的聚类算法具有离散结构&#xff1a;需要重新计算质心和数据点之间的关联&#xff0c;或者需要合并假定的聚类。 在任何一种情况下&#xff0c;优化过程都会被离散的重新配置打断。 连续…

Rockchip RK3588 kernel dts解析之PCIe

Rockchip RK3588 kernel dts解析之PCIe 文章目录 Rockchip RK3588 kernel dts解析之PCIeRK3588控制器RK3588 PHY使用限制DTS配置解析硬件设计软件DTS配置其他常见的PCIE配置对应的DTS配置实例pcie3.0phy拆分2个2Lane RC, 3个PCIe 2.0 1Lane(comboPHY)pcie3.0phy拆分为4个1Lane,…

Deep Complex Convolution Recurrent Network(DCCRN模型)

Abstract 深度学习给语音增强带来很多益处&#xff0c;传统的时频域(TF)方法主要通过朴素卷积神经网络(CNN)或递归神经网络(RNN)预测TF掩码或语音频谱。一些研究将将复值谱图作为训练目标&#xff0c;在实值网络中训练&#xff0c;分别预测幅值和相位分量或实部和虚部。特别是…