时间:2022-03-01来源:www.pcxitongcheng.com作者:电脑系统城
从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
从磁盘文件输入数据,数据输出到磁盘文件简称文件I/O。
对内存中指定的空间进行输入输出,通常指定一个字符数组作为存储空间(存储任何信息),称为字符串输入输出,简称为串I/O
缓冲区:无论是输入还是输出都是存在缓存区的。
常用的成员函数
1,cin.get()
获取一个字符
1 | char c = cin.get(); |
使用cin.get()可以家当缓冲区中的换行符拿走。注意返回值是什么类型的,拿走的数据再输出的时候就是什么类型。
2,cin.get(两个参数)
获取字符串
参数是字符串数组名和个数
使用cin.get(两个参数)那字符串的时候,换行符\0会遗留在缓冲区中。
1 2 3 |
char buf[100] = {0}; cin.get(buf, 100); cout << buf<< endl; |
只满足字符数组,且输出的字符个数总比第二个参数少1.(原因:字符数组最后一个字符是不可见字符’\0’)
3,cin.getline()
获取字符串
接收一个字符串并输出
和cin.get(两个参数)相似,不会将换行符加入字符串,但是也不会留在缓冲区中,而是直接扔掉。
1 2 3 |
char buf[100] = {0}; cin.getline(buf, 100); cout << buf << endl; |
可以有第三个参数,就是终止位置(一个字符,不包括这个字符)
4,cin.ignore()
忽略一个字符
括号中可以填入参数,参数就是忽略字符的个数。默认是一个。
1 2 3 |
cin.ignore(); char c = cin.get(); //ab cout << c << endl; //b,将a忽略了 |
5,cin.peak()
偷窥
1 2 3 4 |
char c = cin.peek(); cout << c << endl; //a char m = cin.get(); cout << m << endl; //a |
缓冲区中,输入了一个a,然后cin.peek()只是看了一眼,并没有拿走,所以调用cin.get()的时候可以直接从缓冲区中拿。
6,cin.putback()
放回(原来的位置)
1 2 3 4 5 |
char c = cin.get(); cin.putback(c); //将从缓冲区拿走的字符返回原位置 char buf[100] = { 0 }; cin.getline(buf, 100); //接收的是缓冲区中的字符串,输出的对象是buf这个字符数组。 cout << buf << endl; |
输入hello,输出仍是hello。
案例一:判断输入的内容是字符串还是数字(不存在混合的情况)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int main() { cout << "请输入一个数字或者一个字符串" << endl; char c = cin.peek(); if (c >= '0' && c <= '9' ) { cout << "数字" << endl; int num; cin >> num; cout << num << endl; } else { cout << "字符串" << endl; char buf[100] = { 0 }; cin >> buf; cout << buf << endl; } return 0; } |
案例二:
用户输入0-10之间的数字,如果输入有误,重新输入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int main() { cout << "请输入一个0-10之间的数字" << endl; while ( true ) { int num; cin >> num; if (num >= 0 && num <= 10) { cout << "输入正确,输入的值为: " << num << endl; break ; } else { cout << "输入有误,请重新输入" << endl; } } return 0; } |
如果输入的是一个数字,那么一切正常。但是如果输入字符,那么就是陷入死循环。这个时候就是缓存区出现了问题。
所以,如果没有输入正确,那么可以进行清空缓存区和重置标志位。(这个标志位如果是0表示缓冲区正常,1就是不正常)
1 2 3 4 5 |
cin.clear(); //清空缓冲区 cin.sync(); //重置标志位 cin.ignore(); //帮助清空2013版本以上需要加。 //上面三句话连着使用。 cin.fail(); //标志位 |
1,cout.put()
,向缓冲区写一个字符
括号里面是啥,就打印啥。
可以拼接使用:cout.put(‘h’).cout.put(‘a’);//打印结果就是:ha
2,cout.write(两个参数)
,
两个参数是char* ,和 对应字符串的长度(不能超过最大长度)。从字符串中拿走规定长度的内容输出。
1 2 |
char arr[] = "hello" ; cout.write(arr, strlen (arr)); //hello |
但是如果要全部打印的话,直接使用cout<<arr<<endl;也是可以的。优点应该是可以打印规定长度的字符串。
格式化输出:
(1) 通过流成员函数 格式化输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int main() { int num = 99; cout.width(5); //指定宽度为20(向前面加空格),结果: 99 cout.fill( '*' ); //空格处都填充上*,结果:***99,(填充内容会被下一此的填充内容覆盖) cout.setf(ios::left); //输出的文本左对齐,结果99*** cout.unsetf(ios::dec); //卸载十进制 cout.setf(ios::hex); //安装十六进制,结果为63*** cout.setf(ios::showbase); //显示基数,结果0x63*。输出对应进制的基数,16进制就是0x cout.unsetf(ios::hex); //卸载十六进制 cout.setf(ios::oct); //安装八进制,结果为0143*。 cout << num << endl; return 0; } |
(2) 使用控制符 格式化输出
如果使用控制符格式化输出的话,需要引用头文件
#include<iomanip>
指定宽度:
1 2 3 4 5 |
int number = 110; cout << setw(20) //指定宽度为20,然后默认将数据右对齐 << number << endl; //运行结果: 110 |
填充:
1 2 3 4 5 6 |
int number = 110; cout << setw(20) << setfill( '*' ) //填充,位置在前在后无所谓 << number << endl; //运行结果:*****************110 |
显示基数:
1 2 3 4 5 6 7 |
int number = 110; cout << setw(20) << number << setfill( '*' ) << setiosflags(ios::showbase) //显示基数 << endl; //运行结果:*****************110,和上面的没有区别,因为十进制是没有基数的。 |
设置左对齐:
1 2 3 4 5 6 7 8 9 |
int number = 110; cout << setw(20) << setfill( '*' ) << setiosflags(ios::showbase) << setiosflags(ios::left) //设置左对齐 << number << endl; //运行结果:110***************** //这个时候需要注意一下,如果按照刚才将number写在前面的时候是得不到想要的结果的,所以应该将最终要输出的内容尽量写在右边。 |
显示十六进制:
1 2 3 4 5 6 7 8 9 |
int number = 110; cout << setw(20) << setfill( '*' ) << setiosflags(ios::showbase) << setiosflags(ios::left) << hex //显示16进制 << number << endl; //运行结果:0x6e**************** |
写文件:
需要引头文件:#include<fstream>
(文件流)
2024-07-07
Java框架如何实现非阻塞式编程?2023-03-11
Android Jetpack 组件LiveData源码解析2023-03-11
hbuilderx设置Firefox浏览器安装路径教程 hbuilderx怎么设置Firefox浏览器安装路径?一、AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 四、AVL树的旋转 1.左单旋 2.右单旋 3.左右双旋 4.右左双旋 五、进行验证 六、AVLTree的性能...
2023-03-09