当前位置: 首页 > news >正文

C++的输入和输出流详解

输入和输出流

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

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

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

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

标准输入流

常用的成员函数

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

1

charc = cin.get();

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

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

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

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

1

2

3

charbuf[100] = {0};

cin.get(buf, 100);

cout << buf<< endl;

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

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

接收一个字符串并输出

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

1

2

3

charbuf[100] = {0};

cin.getline(buf, 100);

cout << buf << endl;

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

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

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

1

2

3

cin.ignore();

charc = cin.get();//ab

cout << c << endl;//b,将a忽略了

5,cin.peak()偷窥

1

2

3

4

charc = cin.peek();

cout << c << endl;//a

charm = cin.get();

cout << m << endl;//a

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

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

1

2

3

4

5

charc = cin.get();

cin.putback(c);//将从缓冲区拿走的字符返回原位置

charbuf[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

intmain()

{

cout <<"请输入一个数字或者一个字符串"<< endl;

charc = cin.peek();

if(c >='0'&& c <='9')

{

cout <<"数字"<< endl;

intnum;

cin >> num;

cout << num << endl;

}

else

{

cout <<"字符串"<< endl;

charbuf[100] = { 0 };

cin >> buf;

cout << buf << endl;

}

return0;

}

案例二:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

intmain()

{

cout <<"请输入一个0-10之间的数字"<< endl;

while(true)

{

intnum;

cin >> num;

if(num >= 0 && num <= 10)

{

cout <<"输入正确,输入的值为: "<< num << endl;

break;

}

else

{

cout <<"输入有误,请重新输入"<< endl;

}

}

return0;

}

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

所以,如果没有输入正确,那么可以进行清空缓存区和重置标志位。(这个标志位如果是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

chararr[] ="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

intmain()

{

intnum = 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;

return0;

}

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

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

#include<iomanip>

指定宽度:

1

2

3

4

5

intnumber = 110;

cout << setw(20)//指定宽度为20,然后默认将数据右对齐

<< number

<< endl;

//运行结果: 110

填充:

1

2

3

4

5

6

intnumber = 110;

cout << setw(20)

<< setfill('*')//填充,位置在前在后无所谓

<< number

<< endl;

//运行结果:*****************110

显示基数:

1

2

3

4

5

6

7

intnumber = 110;

cout << setw(20)

<< number

<< setfill('*')

<< setiosflags(ios::showbase)//显示基数

<< endl;

//运行结果:*****************110,和上面的没有区别,因为十进制是没有基数的。

设置左对齐:

1

2

3

4

5

6

7

8

9

intnumber = 110;

cout << setw(20)

<< setfill('*')

<< setiosflags(ios::showbase)

<< setiosflags(ios::left)//设置左对齐

<< number

<< endl;

//运行结果:110*****************

//这个时候需要注意一下,如果按照刚才将number写在前面的时候是得不到想要的结果的,所以应该将最终要输出的内容尽量写在右边。

显示十六进制:

1

2

3

4

5

6

7

8

9

intnumber = 110;

cout << setw(20)

<< setfill('*')

<< setiosflags(ios::showbase)

<< setiosflags(ios::left)

<< hex//显示16进制

<< number

<< endl;

//运行结果:0x6e****************

文件读写

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

http://www.jsqmd.com/news/705170/

相关文章:

  • 【多旋翼无人机姿态估计】适用于无人机的姿态估计算法,聚焦于线性与非线性姿态估计器的开发与测试,以及在不同飞行条件与环境下的估计
  • AI搜索优化实战:深度评测杭州爱搜索GEO营销系统,如何让工业制造企业成为AI大模型的“标准答案”
  • 【MCP 2026多模态实战白皮书】:首发3大工业级数据对齐范式与实时推理加速方案
  • 医师资格证考试培训推荐|备考党必看!避坑+高效提分攻略(亲测实用) - 品牌测评鉴赏家
  • LRCGet:让本地音乐库拥有完美同步歌词的终极解决方案
  • RE-UE4SS终极指南:3步解锁Unreal Engine游戏无限潜力
  • CURD系统如何做出技术含量?
  • 2026执医备考刷题怎么选?盘点5款考生常用工具,助你避开误区高效复习 - 品牌测评鉴赏家
  • 从45分钟到5分钟:Brigadier如何重构企业级Boot Camp自动化部署架构
  • LFM2.5-1.2B-Instruct部署教程:ARM64架构Linux系统兼容部署方案
  • Redis高级笔记:原理+集群+应用+拓展+源码
  • 2025最权威的降AI率神器推荐榜单
  • 基于OpenFOAM-extend的风-浪联合作用数值模拟:kOmega湍流模型的效率优先实现
  • 如何快速获取中兴光猫完整权限:新手友好的终极指南
  • 终极实战:5个高效微信自动化场景,用wxauto构建你的智能机器人
  • 2026年广州装饰装修公司口碑推荐:办公室、厂房、商铺、酒店会所及网红基地、美容院装修优选指南 - 海棠依旧大
  • 基于SpringBoot的房产销售系统设计与实现(附源码+数据库+文档,一键运行)
  • 终极指南:如何用Windhawk轻松定制你的Windows系统界面与功能
  • Keras函数式API实战:构建复杂深度学习模型
  • 昭昭题库实测解析:是否靠谱?(附详细说明) - 品牌测评鉴赏家
  • 5个核心功能+3种应用场景:NSC_BUILDER让您的Switch游戏管理更高效
  • 2026昭昭题库详细解析 - 品牌测评鉴赏家
  • 034、监控与可观测性:日志、指标与追踪
  • 基于ETAP的110kV变电站无功补偿与谐波抑制仿真研究 - 代码复现
  • 2026届毕业生推荐的五大降AI率平台横评
  • R语言实现惩罚回归:原理、对比与实战案例
  • M-LAG 实验
  • 蓝桥杯STC15单片机PCA定时器配置避坑指南:从CMOD到中断函数,这些细节别搞错
  • Windows触控板完美解决方案:mac-precision-touchpad终极配置指南
  • 羊肺脏有限元模型的建立及其在冲击波作用下的仿真分析复现