目录

cin最简单的使用

cin检查输入

流状态

istream类方法

输入单字符

输入字符串

对流状态的影响

其他istream类方法


cin最简单的使用

使用cin从输入流(一般是键盘生成的)中读取数据,cin >> type,其中 type 可以是任何基本数据类型。另外 cin 还重载了对 char* ,signed char* ,unsigned char* 的 >> 运算符,使得 cin 可以读取一串字符,并在结尾加一个空值字符,形成一个字符串。

当配合 hex,oct,dec 控制符时,可以指定输入的格式是16进制,8进制还是10进制。

cin检查输入

cin 在查看输入流的时候,会自动跳过空白(空格,换行符,制表符)直到遇到非空白字符。对于单字符模式也是如此,这样才能使得如下代码按照我们的预期进行:

int main(){char c1, c2, c3;cin >> c1 >> c2 >> c3;cout << c1 << c2 << c3;
}

接收了用空格隔开的三个字符,最后成功读取到我们想要它接收的正确字符,而没有读取空格。

cin 也会聪明的根据类型选着读取,例如我要接受一个整形给 int 变量赋值,而我输入了一个 123*,显然 * 不是一个数字,那么 cin 就会只读 123,而把 * 留在输入流中等待接下来的 cin 有可能会接收它。

如果我们的输入无法满足 cin 的要求,那么 cin 就不会读入数据,并返回一个 0。例如:

int main(){int a = 1;cin >> a;cout << a << endl;cin.clear(); //此句作用详见流状态cin >> a;cout << a << endl;
}

第一个 cin 我们输入一个 * 号,不是 cin 所期望的整形,那么它将不改变这里 a 的值(这里我尝试的如上图,确实 a 的值不一样了,但cpp说是不改变,这里先放一下),同时返回 0。这里虽然 cin 了两次,但只接受了一个 * 号,为什么两个 cin 都结束了? 因为 * 号在输入流中并没有移除,第二个 cin 接受的还是没有地方安放的那个 * 号,同样因为类型不匹配而返回 0。(到最后 * 号还是无家可归 qaq )

int main(){int a;cin >> a;cout << a << endl;cin.clear();char c;cin >> c;cin >> a;cout << a << endl;
}

而写成这样子,用 char 型变量 c 把 *号接收了,第二个 cin >> a 就可以正常接收整形了!(可怜的 * 号终于有了一个家)

流状态

流状态是顾名思义就是输入或输出流的状态,cin 和 cout 对象都包含了一个描述流状态的变量(iostate 类型),它由三个元素组成:eofbit,failbit,badbit,其中每一个元素都由一位来表示(1代表是,0代表否)。

成员  描述

eofbit

到达文件尾则此位设置为1
badbit 如果流被破坏则此位设置为1
failbit 如果输入未能读取预期的字符或输出操作没有写入预期字符,则此位设置为1
goodbit 流状态正常,也代表所有位为 0 即表示 0
good()

如果流正常则返回 true

eof() 如果 eofbit 为 1 返回 true
bad() 如果 badbit 为 1 返回 true
fail() 如果 badbit 或 failbit 为 1 返回 true
rdstate() 返回流状态
exceptions() 返回一个位掩码,指出哪些标记将导致异常发生
exceptions(iostate ex) 设置哪些状态将导致 clear() 引发异常
clear(iostate s) 将流状态设置为 s,s 默认为 0 即goodbit
setstate(iostate s) 设置与 s 中对应位的流状态,其他位保持不变,相当于用 s 与 当前流状态做 "或运算"

这时,我们再去看上面的那个例子,当我要接收一个int型数字却输入一个char类型的字符,那么此时 cin 没有接收到预期的输入,所以 cin 的流状态将被设置为 failbit ,导致 cin 无法继续接收输入,因此我需要调用 cin.clear() 将流状态置为 goodbit ,cin才能继续接收输入。

istream类方法

输入单字符

使用 get() 方法将读取下一个字符,包括空格、制表符、换行符。

1.使用 get(char &) 成员函数,其返回一个 调用它的 istream 对象的引用,因此可以拼接使用,例如:cin.get( ch1 ).get( ch2 ) >> ch3 ;如果存在有效输入,cin.get(char &) 总返回 true,当到达文件尾时将返回 false。

2.使用 get(void) 成员函数,其返回一个整型,因此它不可拼接,只能在拼接的 cin 序列最后使用,例如:cin.get( ch1 ) >> ch2 .get() ; 当到达文件尾时将返回 EOF。

使用两种方法读取一串字符并按字母打印出来

    char ch1;while(cin.get(ch1)) cout << ch1 << ' ';cout << endl;char ch2;while((ch2=cin.get())!=EOF) cout << ch2 << ' ';cout << endl; 

方法的选择

如果希望跳过空白字符,如空格、换行、制表,就使用 >> 来接收,如果希望接收所有字符,那就使用 get() 方法(例如通过空格来判断单词长度)。而 get() 中 get(char &) 更优,get(void) 主要是因为其与c语言中的 getchar() 类似,可以直接替换。

输入字符串

使用 get() 方法

  1. istream& get(char* str, int num, char ch) 其中 str 为存放输入的字符串的地址(数组名),num 为将要读取的最大字符数+1(因为要有一位结束符),ch 为指定的分隔符。该函数将在读取到最大字符数或遇到分隔符时停止。
  2. istream& get(char* str, int num) 该函数是默认分隔符为换行符,其他同上。

使用getline() 方法

  1. istream& getline(char* str, int num, char ch) 其中 str 为存放输入的字符串的地址(数组名),num 为将要读取的最大字符数+1(因为要有一位结束符),ch 为指定的分隔符。该函数将在读取到最大字符数或遇到分隔符时停止。
  2. istream& getline(char* str, int num) 该函数是默认分隔符为换行符,其他同上。

也许你就会问:欸!博主博主,你这 get 和 getline 的使用方法明显就是复制粘贴的嘛,有啥区别嘛?

区别就是get会把分隔符留在输入队列中,而getline会把分隔符从队列中丢弃。

使用样例

此段输入10个数字,输出的第一行是因为接收到了9个字符(即输入最大字符数)停止接收并输出,第二行因为接收到换行符而结束输入并输出。

此段设置分隔符为 ‘#’ ,接收123后遇到 ‘#’ 停止接受输入并输出,但此时 ‘#’ 还在输入队列中,所以 get() 掉 ‘#’ ,然后在接收456并输出同样是因为 ‘#’ 停止,然后接收789和换行符,此时接收并没有停止,于是我又输入 000# ,接收到 ‘#’ 后,输出789换行符000。

上面两个程序都很简单了,只需要注意get不会丢弃分隔符,而getline会丢弃分隔符!!

对流状态的影响

下面的 getline() 指 getline(char*,int) 和 getline(char*,int,char)。

get(char* , int) 和 getline() 在遇到文件尾时会设置 eofbit,在流破坏时会设置 badbit,在不能接收到字符时(比如立刻到达了文件尾)会把空字符放入数组中,同时设置 failbit。

对于 get(char* ,int) 而言,当接收一个空行时也会设置 failbit,而 getline() 则不会,因为 getlne() 会接收换行符但会丢弃它并在数组中放入空字符。

如果读取了最大字符数且行中还有其他字符,那么 getline() 会设置 failbit。

输入空行,这时 failbit 被设置导致第二个 while 的 cin 没有执行。

输入 ctrl+Z 模拟文件尾,看到 failbit 和 eofbit 都被设置。对于get(char* ,int) 函数也是同样的结果。

getline 超过最大字符数,设置 failbit

其他istream类方法

ignore(int, char) 读取并丢弃接下来int个字符或直到遇到char

read(char*,int) 一般是对文件使用,可拼接

peek() 查看输入队列中的下一个字符,但不抽取下一个字符

gcount() 返回最后一个读取方法读取的字符数(包括get,getline,ignore,read,不包括 >>)

putback(char) 将一个字符插入到输入队列的第一个位置,可拼接

cin且到这里了,输入输出大概都写完了,文件操作虽然很有意思但现在实在没有动力写下去了。。。下次一定!!!

c++ 总结之 cin输入相关推荐

  1. 分段函数返回字符c语言,C++对cin输入字符的判断及分段函数处理方法示例

    本文实例讲述了C++对cin输入字符的判断及分段函数处理方法.分享给大家供大家参考,具体如下: 这两个本来也不是什么问题,然而真正遇到还是有地方可以研究的.首先是C++对于cin输入的判断,有时候你定 ...

  2. cin输入字符串允许输入空白符

    cin输入字符串允许输入空白符 文章目录 cin输入字符串允许输入空白符 使用noskipws 使用cin.getline() std::getline() int main() {string s1 ...

  3. 对C++中使用cin输入非法字符(数据格式不匹配)的说明

    在C语言中,使用格式化输入函数scanf("%d",&i)(i为int)时,如果输入了字符,则会将字符转化为对应的ASCII码并赋给i. 但在C++中使用cin时输入非法字 ...

  4. 清除cin输入缓冲区,以及system(“pause“)、system(“cls“)用法

    system("pause").system("cls") system("pause"):简单来说就是暂停的意思,等待接收信号,才会重新运 ...

  5. C++利用cin输入时检测回车的方法

    今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环. 但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检测回 ...

  6. cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()

    1.cin.clear():清除cin流的错误状态,将错误标识改为默认0 2.cin.sync():清除缓冲区的数据 3.cin.ignore(): 其原型为: istream & ignor ...

  7. C++中cin输入类型不匹配解决方法

    1 #include <iostream> 2 #include <set> 3 4 using namespace std; 5 6 int main() 7 { 8 int ...

  8. C++ while(cin>>a) cin输入直到回车结束

    经常遇到循环输入,直到符合某种条件时结束输入. cin>>s是有返回值的,只要s满足类型条件,就会return true,一直执行下去,而cin会忽略空格或者enter,因此,enter后 ...

  9. c语言cin输入数组,C++基础:各种输入方法总结cin.get()、

    原标题:C++基础:各种输入方法总结cin.get(). 在C++中,各种输入方法还是不少的,而且各有所异,本文做一点简要总结,主要涉及如下内容:cin.cin.get().cin.getline() ...

  10. 如何判断cin输入结束~

    很简单耶 直接判断cin >> a就可以啦 不需要什么EOF和~取反符号哦 输入结束就自动退出循环啦 #include <iostream> using namespace s ...

最新文章

  1. linked-list-cycle-ii (数学证明)
  2. http接口测试工具——RESTClient
  3. POJ 2492 A Bug's Life 带权并查集
  4. darknet_ros消息在其它包中的订阅
  5. 【Linux】Linux软件安装和定时任务
  6. 机器视觉对印刷业的影响
  7. [导入]Nebula3学习笔记(3): Core Namespace
  8. 论文笔记_S2D.28_2014-ICRA_REMODE:概率单目实时稠密重建
  9. 批处理重置IE、批处理清理浏览器缓存、默认以管理员权限运行批处理
  10. 计算机组成原理中EMAR是什么,计算机组成原理(罗克露)第3章cpu.ppt
  11. matlab模拟多个平面波,Desktop matlab模拟两束平面波干涉 (1)光源非单色性的影响 联合开发网 - pudn.com...
  12. JAVA WEB 复习资料
  13. 用diiv实现多个方块居中嵌套--margin
  14. mysql写系统_一个用PHP和MYSQL写的定饭系统_PHP
  15. 一个算法工程师复现算法的踩坑总结
  16. RTC直播与RTMP直播
  17. ファイルダウンロード
  18. 时间复杂度空间复杂度分析
  19. 上海亚商投顾:沪指高开低走涨0.45% 大消费王者归来
  20. android模拟器 报错:X Error of failed request: BadRequest (invalid request code or no such operation)

热门文章

  1. 普通的Shader-物体移动身后残影的一种实现
  2. chgrp linux,Linux chgrp命令
  3. 一个方法写入Excel和txt文本文件
  4. 在vmware上直接运行xv6
  5. Zabbix监控路由器
  6. 使用matlab对sinc函数进行最小二乘拟合仿真
  7. 高斯消元(Java实现)
  8. “打鱼”还是“晒网”
  9. wxpy 机器人报错解决方案
  10. 【ubuntu20.04实践】更改网卡IP地址