经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++的输入和输出流详解
来源:jb51  时间:2022/3/1 13:39:42  对本文有异议

输入和输出流

从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。

从磁盘文件输入数据,数据输出到磁盘文件简称文件I/O。

对内存中指定的空间进行输入输出,通常指定一个字符数组作为存储空间(存储任何信息),称为字符串输入输出,简称为串I/O

img

缓冲区:无论是输入还是输出都是存在缓存区的。

标准输入流

常用的成员函数

1,cin.get()获取一个字符

  1. char c = cin.get();

使用cin.get()可以家当缓冲区中的换行符拿走。注意返回值是什么类型的,拿走的数据再输出的时候就是什么类型。

2,cin.get(两个参数)获取字符串

参数是字符串数组名和个数

使用cin.get(两个参数)那字符串的时候,换行符\0会遗留在缓冲区中。

  1. char buf[100] = {0};
  2. cin.get(buf, 100);
  3. cout << buf<< endl;

只满足字符数组,且输出的字符个数总比第二个参数少1.(原因:字符数组最后一个字符是不可见字符’\0’)

3,cin.getline()获取字符串

接收一个字符串并输出

和cin.get(两个参数)相似,不会将换行符加入字符串,但是也不会留在缓冲区中,而是直接扔掉。

  1. char buf[100] = {0};
  2. cin.getline(buf, 100);
  3. cout << buf << endl;

可以有第三个参数,就是终止位置(一个字符,不包括这个字符)

4,cin.ignore()忽略一个字符

括号中可以填入参数,参数就是忽略字符的个数。默认是一个。

  1. cin.ignore();
  2. char c = cin.get();//ab
  3. cout << c << endl;//b,将a忽略了

5,cin.peak()偷窥

  1. char c = cin.peek();
  2. cout << c << endl;//a
  3. char m = cin.get();
  4. cout << m << endl;//a

缓冲区中,输入了一个a,然后cin.peek()只是看了一眼,并没有拿走,所以调用cin.get()的时候可以直接从缓冲区中拿。

6,cin.putback()放回(原来的位置)

  1. char c = cin.get();
  2. cin.putback(c);//将从缓冲区拿走的字符返回原位置
  3. char buf[100] = { 0 };
  4. cin.getline(buf, 100);//接收的是缓冲区中的字符串,输出的对象是buf这个字符数组。
  5. cout << buf << endl;

输入hello,输出仍是hello。

小案例

案例一:判断输入的内容是字符串还是数字(不存在混合的情况)

  1. int main()
  2. {
  3. cout << "请输入一个数字或者一个字符串" << endl;
  4. char c = cin.peek();
  5. if (c >= '0' && c <= '9')
  6. {
  7. cout << "数字" << endl;
  8. int num;
  9. cin >> num;
  10. cout << num << endl;
  11. }
  12. else
  13. {
  14. cout << "字符串" << endl;
  15. char buf[100] = { 0 };
  16. cin >> buf;
  17. cout << buf << endl;
  18. }
  19. return 0;
  20. }

案例二:

用户输入0-10之间的数字,如果输入有误,重新输入。

  1. int main()
  2. {
  3. cout << "请输入一个0-10之间的数字" << endl;
  4.  
  5. while(true)
  6. {
  7. int num;
  8. cin >> num;
  9. if (num >= 0 && num <= 10)
  10. {
  11. cout << "输入正确,输入的值为: " << num << endl;
  12. break;
  13. }
  14. else
  15. {
  16. cout << "输入有误,请重新输入" << endl;
  17. }
  18. }
  19. return 0;
  20. }

如果输入的是一个数字,那么一切正常。但是如果输入字符,那么就是陷入死循环。这个时候就是缓存区出现了问题。

所以,如果没有输入正确,那么可以进行清空缓存区和重置标志位。(这个标志位如果是0表示缓冲区正常,1就是不正常)

  1. cin.clear();//清空缓冲区
  2. cin.sync();//重置标志位
  3. cin.ignore();//帮助清空2013版本以上需要加。
  4. //上面三句话连着使用。
  5. cin.fail();//标志位

标准输出流

1,cout.put(),向缓冲区写一个字符

括号里面是啥,就打印啥。

可以拼接使用:cout.put(‘h’).cout.put(‘a’);//打印结果就是:ha

2,cout.write(两个参数),

两个参数是char* ,和 对应字符串的长度(不能超过最大长度)。从字符串中拿走规定长度的内容输出。

  1. char arr[] = "hello";
  2. cout.write(arr, strlen(arr));//hello

但是如果要全部打印的话,直接使用cout<<arr<<endl;也是可以的。优点应该是可以打印规定长度的字符串。

格式化输出:

(1) 通过流成员函数 格式化输出

  1. int main()
  2. {
  3. int num = 99;
  4. cout.width(5);//指定宽度为20(向前面加空格),结果: 99
  5. cout.fill('*');//空格处都填充上*,结果:***99,(填充内容会被下一此的填充内容覆盖)
  6. cout.setf(ios::left);//输出的文本左对齐,结果99***
  7. cout.unsetf(ios::dec);//卸载十进制
  8. cout.setf(ios::hex);//安装十六进制,结果为63***
  9. cout.setf(ios::showbase);//显示基数,结果0x63*。输出对应进制的基数,16进制就是0x
  10. cout.unsetf(ios::hex);//卸载十六进制
  11. cout.setf(ios::oct);//安装八进制,结果为0143*。
  12. cout << num << endl;
  13. return 0;
  14. }

(2) 使用控制符 格式化输出

如果使用控制符格式化输出的话,需要引用头文件

#include<iomanip>

指定宽度:

  1. int number = 110;
  2. cout << setw(20)//指定宽度为20,然后默认将数据右对齐
  3. << number
  4. << endl;
  5. //运行结果: 110

填充:

  1. int number = 110;
  2. cout << setw(20)
  3. << setfill('*')//填充,位置在前在后无所谓
  4. << number
  5. << endl;
  6. //运行结果:*****************110

显示基数:

  1. int number = 110;
  2. cout << setw(20)
  3. << number
  4. << setfill('*')
  5. << setiosflags(ios::showbase)//显示基数
  6. << endl;
  7. //运行结果:*****************110,和上面的没有区别,因为十进制是没有基数的。

设置左对齐:

  1. int number = 110;
  2. cout << setw(20)
  3. << setfill('*')
  4. << setiosflags(ios::showbase)
  5. << setiosflags(ios::left)//设置左对齐
  6. << number
  7. << endl;
  8. //运行结果:110*****************
  9. //这个时候需要注意一下,如果按照刚才将number写在前面的时候是得不到想要的结果的,所以应该将最终要输出的内容尽量写在右边。

显示十六进制:

  1. int number = 110;
  2. cout << setw(20)
  3. << setfill('*')
  4. << setiosflags(ios::showbase)
  5. << setiosflags(ios::left)
  6. << hex//显示16进制
  7. << number
  8. << endl;
  9. //运行结果:0x6e****************

文件读写

写文件:

需要引头文件:#include<fstream>(文件流)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容! 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号