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

【C++】IO流详解

C语言中我们用到的最频繁的输入输出方式就是 scanf() 和 printf()。

scanf():从标准输入设备(键盘)读取数据,并将值存放在变量中。

printf():将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。

除此之外,C语言借助了相应的缓冲区来进行输入和输出。如下图所示:

输入输出缓冲区的理解:

1.可以屏蔽掉低级I/O的实现,低级 I/O 的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序

2.可以使用这部分的内容实现 “行” 读取的行为,对于计算机而言是没有 “行” 这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。

Ⅱ. 流是什么

“流” 即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续具有方向性的数据(其单位可以是bitbytepacket)的抽象描述。

C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。

🐛 它的特性是:有序连续具有方向性

为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能

Ⅲ. C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios

📆 其中值得注意的是cerrclog是很少用的,它们本来是用做错误输出日志输出的,但是因为cout也能做到,所以这两个很少被使用。

  • <iostream>标准IO流

    • 对于cin:在 C++ 中称为流提取,也就是在 IO流 中提取信息,比如说读文件、获取键盘的信息等

    • 对于cout:在 C++ 中称为流插入,也就是在 IO流 中插入信息,比如说写文件、将信息输出到屏幕等

  • <fstream>文件IO流,支持通过流的方式来读写文件

    • 对于fstream既支持读也支持写文件经常用,而另外三个比较少用,因为这个功能比较多!

  • <sstream>:用来支持字符串的序列化与反序列化,多用于网络,与流关系不大

    • 对于stringsream:字符串常用这个

我们来研究下面这两段代码:

代码一:

展开

代码语言:C++

自动换行

AI代码解释

struct Student { string _name = "liren"; int _age = 20; }; ​ int main() { Student s; cin >> s._name >> s._age; cout << "名字:" << s._name << " 年龄:" << s._age << endl; ​ scanf("%s%d", s._name.c_str(), &s._age); printf("名字:%s 年龄:%d\n", s._name.c_str(), s._age); return 0; }

这段代码看上去没有什么问题,但如果我们第二次输入的字符串过长,会导致程序崩溃,原因如下 :

string内部会有一个_Buf数组,当存储的字符串大小小于 15 字节时,不会去堆上开辟空间存储字符串,会将字符串存储在_Buf数组中,但无论第一次输入的字符串大小是大于 15 字节还是小于 15 字节,第二次如果输入过长,都会导致程序崩溃,原因在于第二次是用scanf进行输入,使用scanf输入,不会影响stringsizecapacity,因为string中只重载了>><<,所以输入过长就会越界写入!

代码二:

展开

代码语言:C++

自动换行

AI代码解释

struct Student { string _name = "liren"; int _age = 20; }; ​ int main() { Student s; ​ cin >> s._name >> s._age; printf("名字:%s 年龄:%d\n", s._name.c_str(), s._age); cout << "名字:" << s._name << " 年龄:" << s._age << endl; ​ scanf("%s%d", s._name.c_str(), &s._age); printf("名字:%s 年龄:%d\n", s._name.c_str(), s._age); cout << "名字:" << s._name << " 年龄:" << s._age << endl; ​ return 0; }

这段代码和上一段代码相比只是最后的输出使用了cout,跟上面一样,如果输入过长也会导致越界写入,除此之外,就算输入的长度在合法的范围内,打印出来的结果也不是我们想要的,原因是cout在输出时是根据stringsize来输出的,而scanf输入时并没有改变** string** 的size,所以打印结果不是我们想要的,上面的printf如果输入的长度在合法的范围内,打印结果就是我们想要的,原因是printf打印字符串时是根据\0的位置来判断的。

为了解决这两个问题,我们需要提前为string变量扩容:

展开

代码语言:C++

自动换行

AI代码解释

struct Student { string _name = "liren"; int _age = 20; }; ​ int main() { Student s; ​ cin >> s._name >> s._age; printf("名字:%s 年龄:%d\n", s._name.c_str(), s._age); cout << "名字:" << s._name << " 年龄:" << s._age << endl; ​ s._name.resize(100); //提前扩容! ​ scanf("%s%d", s._name.c_str(), &s._age); printf("名字:%s 年龄:%d\n", s._name.c_str(), s._age); cout << "名字:" << s._name << " 年龄:" << s._age << endl; ​ return 0; } ​ 🚩 运行结果: liren 15 名字:liren 年龄:15 名字:liren 年龄:15 lirendada 15 名字:lirendada 年龄:15 名字:lirendada 年龄:15

总结:建议在C++中尽量去用cincout,用coutcin不方便的地方,再去用scanfprintf(格式控制输出时)

1. C++标准IO流

C++ 标准库提供了 4 个全局流对象 cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时 C++ 标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog 是 ostream 类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。

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

相关文章:

  • 如何在C++的STL中巧妙运用std::find实现高效查找
  • 《不可被“框定”的理论:一场正在发生的生成性实验》研究
  • P14954 520 个人题解
  • 非遗万象图
  • 数据仓库与数据湖:大数据运营的存储架构对比
  • Docker一键搭建JmalCloud 个人网盘--自带博客!
  • 硅谷奇闻:英伟达创始人黄仁勋的家族传承与未来押注
  • Python+Vue的基于协同过滤算法的美食推荐系统 Pycharm django flask
  • vue基于Python基于大数据技术的共享单车数据分析与辅助管理系统 _Pycharm django flask
  • 学霸同款2025一键生成论文工具TOP9:本科生毕业论文必备测评
  • 深度测评!9个AI论文网站助你搞定毕业论文
  • 请求Cloudflare部署的pages资源的时候出现cors跨域问题
  • Python+Vue的基于大数据技术的电影推荐系统的设计与实现 Pycharm django flask
  • 学习笔记:PID算法入门笔记-电机控制-倒立摆
  • 吐血推荐!9款AI论文写作软件测评:研究生科研写作全攻略
  • Python+Vue的 增强可视化的广州IT招聘系统Pycharm django flask
  • Elasticsearch:在 Streams 中使用 ML 自动化 log 解析
  • 聚焦七大主战场丨华为孟晚舟:唯有迎难而上
  • 华为Pura 80系列有多香?到手可升级鸿蒙 6,至高还减1500元
  • phome_enewsfava 数据表字段解释(收藏表)
  • win10/win11安装Word、EXCEL、PPT、VISIO
  • 华为“不讲武德”,6500mAh+100W+鸿蒙OS6,首销跌至“新低价”
  • Creed —— 过场动画
  • 数据安全新防线:本地知识库
  • Creed —— 盾牌格挡
  • phome_enewsfavaclass 数据表字段解释(收藏分类表)
  • C语言2:分支循环
  • phome_enewsmembergroup 数据表字段解释(会员组表)
  • 点击劫持解析:揭秘看不见的界面攻击
  • 【A_Star三维路径规划】基于matlab A_Star算法无人机三维路径规划(含雷达威胁)【含Matlab源码 14816期】