【C++】IO流

【C++】IO流

🌈个人主页:秦jh_-ZEEKLOG博客
🔥 系列专栏:https://blog.ZEEKLOG.net/qinjh_/category_12575764.html?spm=1001.2014.3001.5482

 ​ 

目录

C语言的输入与输出

流是什么

C++IO流 

C++标准IO流

C++文件IO流

二进制读写 

 文本读写

stringstream的简单介绍 


前言

💬 hello! 各位铁子们大家好哇。

             今日更新了C++IO流的相关内容
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示:

对输入输出缓冲区的理解:

  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏 蔽这部分的差异,可以很容易写出可移植的程序。
  2. 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。

流是什么

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

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

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

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

C++IO流 

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

C++标准IO流

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

在使用时候必须要包含文件并引入std标准命名空间。 

注意:

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输 入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法 挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。
  2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对 应位置位(置1),程序继续。
  3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输 入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有 空格。回车符也无法读入。
  4. cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了: 
  5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
  6.  在线OJ中的输入和输出:
    1. 对于IO类型的算法,一般都需要循环输入。
    2. 输出:严格按照题目的要求进行,多一个少一个空格都不行。
    3. 连续输入时,vs系列编译器下在输入ctrl+Z时结束 
  7. istream类型对象转换为逻辑条件判断值
实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是 istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false。

operator bool 会去检查四个标志值,如果当中的后三个有一个被设置了(即eof、fail、bad),就返回false,否则返回true。       

如下图,正常时输入前,good标志位是1,其他是0。 

 

当我们输入x,是读不进去的。fail标志就被标记了,流就出错了,后面第二个cin也读不出来。

 

流是可以被恢复的, 用clear后,good标志位就被设置了。但是后面的x还是读不出来,因为只是修改了标志位,x还在缓冲区里,x是字符,这里要的是整形。
如果要让后面能够继续读,就要把这个字符拿走,这样这个流才算恢复了。 

 提高io效率:

//在io需求比较高的地方,如部分大量输入的竞赛中,加上一下3行代码 //可以提高c++IO效率 ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 

C++文件IO流

C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步 骤: 

1.定义一个文件流对象ifstream ifile(只输入用)ofstream ofile(只输出用)fstream iofile(既输入又输出用)

2.使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系

3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写

4.关闭文件 
运行后,就可以在当前目录找到这个文件,里面就打印了xxxxx了。默认是覆盖写的。
如果需要追加写,需要加上ofstream::app 选项。 创建对象时,mode缺省值是ofstream::out 所以前面没有带选项。
上面是用good判断是否正常读到,如果发生错误了,就停止读。

 Date类:

class Date { friend ostream& operator << (ostream& out, const Date& d); friend istream& operator >> (istream& in, Date& d); public: Date(int year = 1, int month = 1, int day = 1) :_year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; istream& operator >> (istream& in, Date& d) { in >> d._year >> d._month >> d._day; return in; } ostream& operator << (ostream& out, const Date& d) { out << d._year << " " << d._month << " " << d._day; return out; }

二进制读写 

 运行上面程序,是以二进制形式写的。
上面是以二进制的形式读,以什么方式写,就以什么方式读。 

二进制方式的缺陷:写出去的内容打开的时候啥也看不见,或者只能看见部分信息。

特点就是简单。

 

如果用string进行二进制读写,就会出问题,程序回崩溃。 

写到文件的本质是_ip对象中的一个指针。

二进制方式写,如果是string、vector等对象,就会出问题,本质没有数据内容写到文件,而是数据内容的指针写到文件中。

 文本读写

如果用文本方式读写,就不会出现前面的问题。

stringstream的简单介绍 

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?

  1. 使用itoa()函数
  2.  使用sprintf()函数 

但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定, 而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。 

在C++中,可以使用stringstream类对象来避开此问题。 在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类: istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作, 

stringstream主要可以用来:

  1. 将数值类型数据格式化为字符串 
  2. 字符串拼接
  3. 序列化和反序列化结构数据

接收时要解析成结构信息:

注意:

  1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
  2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将 stringstream底层的string对象清空。
  3.  可以使用s. str("")方法将底层string对象设置为""空字符串。
  4. 可以使用s.str()将让stringstream返回其底层的string对象。
  5. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。 

Read more

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手 Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手,该教程详细讲解如何用 Python 爬取网易新闻每日热文,先介绍爬虫 “请求 - 解析 - 提取 - 保存” 原理及 requests、BeautifulSoup4 等必备库的安装,再逐段解析完整代码:从设置请求头模拟浏览器、发送 HTTP 请求获取网页数据,到通过关键词匹配和类名匹配双方案提取 “今日推荐” 热文,还包含数据去重、Excel 保存(按日期命名)及异常处理与调试模块。同时给出实操步骤,解答爬取不到数据、Excel 保存失败等常见问题,强调爬虫伦理与法律规范,最后提供定时爬取、多频道爬取等功能扩展建议,帮助小白轻松上手打造自动新闻采集工具。 前言     Python作为一门简洁、易读、功能强大的编程语言,

By Ne0inhk
【2025 最新】 Python 安装教程 以及 Pycharm 安装教程(超详细图文指南,附常见问题解决)

【2025 最新】 Python 安装教程 以及 Pycharm 安装教程(超详细图文指南,附常见问题解决)

前言         Python 作为目前最热门的编程语言之一,在数据分析、人工智能、Web 开发等领域应用广泛。而 PyCharm 作为 JetBrains 推出的 Python 集成开发环境(IDE),以其强大的功能和友好的界面成为开发者的首选工具。         本文针对 2025 年最新版 Python(3.13.x)和 PyCharm(202x.x.x),提供Windows 10或11和macOS Sonoma双系统安装教程,从官网下载到环境配置一步到位,同时整理了安装过程中最常见的 10 类问题及解决方案,确保新手也能顺利完成环境搭建。 一、Python 安装教程(2025 最新版) 1. 下载 Python 安装包 步骤 1:访问 Python 官网

By Ne0inhk
【测试基础】Python 核心语法,一篇搞定测试脚本开发基础

【测试基础】Python 核心语法,一篇搞定测试脚本开发基础

🔥个人主页: 中草药  🔥专栏:【Java】登神长阶 史诗般的Java成神之路 本文不做Python以及Pycharm安装的详细教程,请大家自行查阅资料,或到官网去下载         Python作为一门 “优雅且强大” 的编程语言,Python 凭借易上手、用途广的特点,成为很多人入门编程的首选。无论是数据分析、人工智能,还是 Web 开发、自动化脚本,Python 都能胜任。但想要用好 Python,扎实的基础语法是关键 —— 本文将结合系统的语法知识,从 “计算器” 级别的简单运算,到数据持久化的文件操作,带你一站式吃透 Python 核心语法,让你看完就能上手写代码! 变量与数据类型:程序的"原材料仓库"         变量就像快递盒,用来装不同类型的数据;数据类型则是快递盒上的标签,告诉我们里面装的是文件、水果还是电子产品。类型系统其实是在对变量进行 "归类"

By Ne0inhk

用 Python 30 分钟做出自己的记事本

🌟 《零基础手把手:用 Python 30 分钟做出自己的记事本》 —— 不是照抄代码,而是理解每行代码的「灵魂」 🧩 第一步:为什么我们需要「基础窗口」?(新手必懂!) ❌ 常见错误:直接写 window.show() 但窗口不显示? ✅ 正确逻辑:程序运行流程图 启动程序 创建应用对象 创建窗口 显示窗口 进入事件循环 📝 代码详解(逐行解释): import sys # 必须!用于接收系统参数(比如文件路径)from PyQt6.QtWidgets import QApplication, QMainWindow # 从PyQt库导入两个核心组件# 1️⃣ 创建应用对象(灵魂!所有PyQt程序必须有) app = QApplication(sys.argv)# sys.argv = 系统传递的命令行参数(比如打开的文件名)

By Ne0inhk