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

【C++课程学习】:C++中的IO流(istream,iostream,fstream,sstream)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

C++学习笔记:

https://blog.csdn.net/djdjiejsn/category_12682189.html

前言:

 在C语言中有各种IO流,控制台IO流,文件IO流。C++作为一门面向对象的语言,肯定是要自己封装IO流的。更加灵活,自定义类也可以重载输入输出流。

目录

1.C语言中的流

1.1控制台IO:

1.2输入,输出缓冲区:

1.3 流是什么:

2.C++的IO流

2.1说明:

2.2标准流(cin)的标志位:

2.3当出现类型不匹配出现输入流fail错误时,怎么处理?

3.C++的标准IO流:

3.1使用说明:

3.3注意事项:

3.4istream作为逻辑判断真假

4.C++文件IO流

5.stringstream流


1.C语言中的流

1.1控制台IO:

控制台(console)流有printf,scanf

scanf从标准输入设备读取数据,放到变量中
printf向标准输出设备中输出数据

1.2输入,输出缓冲区:

设计输入输出缓冲区的好处:

提高效率,直接将一个小部分整体IO,避免多次IO。IO是和外设打交道,是很浪费时间的。

●有了缓存区,IO的底层实现可以交给操作系统,我们要IO的数据,直接拷贝到缓冲区就行,剩下的交给操作系统,其他类似的缓冲区也是这样的原理。这样可以上次开发不要管IO这部分了,屏蔽这部分的差异,开发效率更高。

●还有一点就是,计算机本来没有‘行’的概念,缓冲区的大小,就可以定义为行的大小,从而可以向缓冲区写满就刷新(按行刷新)。

1.3 流是什么:

1.有序, 2.连续, 3.有方向


2.C++的IO流

2.1说明:

除了标准IO流,还有文件IO流,stringIO流,后面都讲一下,C++的IO流是一个庞大的体系。继承关系可见下面的图。

推荐C++语法查询的网站:https://www.cplusplus.com/

不是官方的网站,但是感觉挺好用,有什么忘记了的一查便知。

ios继承ios_base,箭头就表示继承。

可见标准IO,文件IO,stringIO,都是由istream,ostream继承来的。

2.2标准流(cin)的标志位:

goodbit为1时,表示输入流正常。
eofbit为1时,表示读到文件末尾。
failbit为1时,表示逻辑错误,轻微错误,可以恢复
badbit为1,表示读写错误,严重错误,不可回复

 上面的这四个标志位,iostat用的是位图的思想,某个比特位为1,就表示某种情况,所以他们要被一起设置的时候,用按位与|。

eofbit, failbit and badbit are member constants with implementation-defined values that can be combined (as if with the bitwise OR operator). goodbit is zero, indicating that none of the other bits is set.

当eofbit,failbit,badbit没有被设置的时候,goodbit被设置。

2.3当出现类型不匹配出现输入流fail错误时,怎么处理?

类型不匹配,failbit被设置,badbit时很严重的错误,进程直接没了。

一:先把三个错误都设置为0,goodbit就设置为1了,就能正常使用了。

通过clear,setstate函数进行设置。

stat函数:

void setstate (iostate state);

clear函数:

void clear (iostate state = goodbit);

我觉得这个clear更好,因为默认的参数就是goodbit。

二:把cin输入缓冲区里面的数据全部拿走。

避免再次输入错误。

整体代码:

    if (cin.fail())
    {
        //清理标志位
        cin.clear();
        //清理缓冲区
        getline(cin, s);
    }

#include <iostream>
#include <string>
using namespace std;int main()
{int n;cin >> n;cout << n << endl;string s;if (cin.fail()){//清理标志位cin.clear();//清理缓冲区getline(cin, s);}cout << "11111111111111" << endl;cout << cin.good() << endl;cout << cin.fail() << endl;cout << cin.bad() << endl;cout << cin.eof() << endl;cout << "11111111111111" << endl;cin >> n;cout << n << endl;return 0;
}

3.C++的标准IO流:

3.1使用说明:

标准输入(cin),标准输出(cout),标准错误(cerr),标准日志(clog)都是继承ios。

前一个是由istream来的,后面三个是ostream来的。

cin是从输入缓冲区读取,放入变量中。

cout,cerr,clog都是向显示器输出,这三个差不多,应用场景不一样。用法如下。

他们都在命名空std中,要不展开命名空间,要不每次用的时候,指明命名空间。

#include <iostream>
using namespace std;int main()
{int a;cin >> a;			//标准输入cout <<"cout:" << a << endl;	//标准输出cerr <<"cerr:" << a << endl;	//标准错误clog <<"clog:" << a << endl;	//标准日志return 0;
}

// 单个元素循环输入
while(cin>>a)
{
    // ...
}
// 多个元素循环输入
while(c>>a>>b>>c)
{
    // ...
}
// 整行接收
while(cin>>str)
{
    // ...

3.3注意事项:

1.我们在用cin的时候,如果我们输错了,一定要在回车之前修改,回车以后就写入输入缓冲区了,就不能修改了。前面也说了流是有方向的,连续的,有方向的,所以输入流,要把前面的读完,才能读后面的。

2.输入的类型和提取的类型必须一样,否则出错,根据不同错误设置不同的bit位。

3.空格和换行可以作为数据之间的区分标志。

4.内置类型库中已经重载了,如果自定义类型要想使用,要重载operator<<,operator>>。

5.连续输出时,Ctrl+z结束,错误标志failbit被设置。

3.4istream作为逻辑判断真假

我们在连续输入的时候,cin>>n放在while里面,但是operator >>函数返回的istream&,istream为什么能作为真假进行判断呢?

其本质是istream又去调用了operator bool()

当流失败的时候,有错误标志的时候,返回false,流没有问题的时候,就返回true,就能进行真假判断了。

    //while(cin>>n)
    while ((cin>>n).operator bool())
    {

        //哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

        //相信美好的事情即将发生
    }


4.C++文件IO流

包含的头文件:

#include <fstream>

文件的可区分为:二进制文件,文本文件。

●ifstream ifile(只输入用)

●ofstream ofile(只输出用)

●fstream iofile(既输入又输出用)

刚刚在写的时候,就打开同一个文件,用ifstream,ofstream同时打开同一个文件,就读不出来了,要对文件读写,得用fstream。BUG

还有就是打开文件设置的权限。

ios_base::binary|ios_base::in

int main()
{//const string filename = "file.txt";//ofstream out(filename);//int n = 1001;//out <<n;//out.close();//int m;//ifstream in(filename);//in >> m;//cout << m;const string filename = "file.txt";//用|将这个合并fstream out(filename,ios_base::binary|ios_base::in);int n = 1001;out <<n;int m;ifstream in(filename, ios_base::binary | ios_base::in);in >> m;cout << m;return 0;
}

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

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

3.关闭文件。


5.stringstream流

这个流的主要用途是,把一系列的类型,转换为字符串。

C语言中的转字符串的函数有:

1.使用itoa()函数。

2.使用sprintf()函数。

这两个函数就是要先开空间,确定好空间的大小,不太好使用。

int main()
{stringstream s;int a = 12134;string str;s << a;str=s.str();cout << str;return 0;
}

stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit,因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换,但是clear()不会将stringstreams底层字符串清空掉 。

1.stringstream底层是维护了一个string对象保存。

2.对同一个流多次转换时,一定要clear()清理,才能正确转换,但是clear不会把底层的string对象清空。

3.可以用.str("")对string对象进行清空。

4.用.str()拿到底层的string对象里的对象。

相关文章:

【C++课程学习】:C++中的IO流(istream,iostream,fstream,sstream)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 C学习笔记&#xff1a; https://blog.csdn.net/djdjiejsn/category_12682189.html 前言&#xff1a; 在C语…...

C语言实现冒泡排序,超详解

引言 用c语言实现使用冒泡排序 一、什么是冒泡排序 冒泡排序是一种简单的排序算法 基本原理 冒泡排序的基本思想是通过对数组中相邻元素的比较和交换&#xff0c;将最大&#xff08;或最小&#xff09;的元素逐步 “冒泡” 到数组的末尾&#xff08;或开头&#xff09;。它重…...

Flutter——Android与Flutter混合开发详细教程

目录 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b;2.或者编辑aar引用3.创建Android原生项目3.直接运行跑起来 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b; 2.或者编辑aar引用 执行 flutter build a…...

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…...

【eNSP实战】配置Easy IP

拓图 要求&#xff1a; 在AR1配置Easy IP策略实现内网可以访问Internet主机IP如图所示&#xff0c;这里不做展示 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.0.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 10.0.1.1 255.255.255.0 …...

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…...

【Python 语法】排序算法

十大排序算法比较类排序(Comparison Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort)希尔排序(Shell Sort)插入排序(Insertion Sort)冒泡排序(Bubble Sort)选择排序(Selection Sort)2. 非比较类排序(Non-Comparison Sort)计数排序(Countin…...

SpringCloudAlibaba项目搭建

版本关系 我这一套用的是&#xff1a; mySQL版本 5.5.15 boot版本 2.2.13.RELEASE cloud版本 Hoxton.RELEASE cloud alibaba版本 2.2.0 nacos openFeign Gateway sentinel seata的pom赖版本为cloudAlibaba默认的 nacos 客户端版本 1.1.4 sentinel dashboard版本 1.7.1 s…...

Oracle VirtualBox安装CentOS 7

Oracle VirtualBox虚拟机安装CentOS 7 该文章记录了在Windows上使用Oracle公司&#xff08;甲骨文&#xff09;的Virtual Box安装CentOS 7的过程中&#xff0c;所遇到到的一些困难和解决方案。 目录 Oracle VirtualBox虚拟机安装CentOS 7一、前期准备工作1.Virtual Box2.Cent…...

linux docker 安装dify本地运行,及部署后运行出现502问题

1、git 拉取代码:git&#xff08; https://github.com/langgenius/dify.git&#xff09; git clone https://github.com/langgenius/dify.git2、进入项目目录 的docker下 cd docker3、复制一份本地运行的环境 cp .\.env.example .env查看本地的端口&#xff1a;80和443端口…...

计算机网络——DHCP

一、什么是DHCP&#xff1f; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是一种网络管理协议&#xff0c;用于自动分配IP地址、子网掩码、网关、DNS等网络参数给客户端设备。它像一个“智能管家”&#xff0c;让设备无需手…...

kettle ETL 配置

pdi-ce-9.1.0.0-324 配置-CSDN博客 3、配置中文字符 3.1&#xff09; spoon支持中文字符&#xff0c; spoon.bat启动文件加 -Dfile.encodingutf-8 REM %SPOON_START_OPTION% "%_PENTAHO_JAVA%" %JAVA_ADD_OPENS% %OPT% -jar launcher\launcher.jar -lib ..\%LIBSPAT…...

LeetCode 3280 将日期转换为二进制表示

【算法实战】日期转二进制&#xff1a;两种解法的思路与优化&#xff08;附代码解析&#xff09; 一、问题描述 给定一个yyyy-mm-dd格式的日期字符串&#xff0c;要求将年、月、日分别转为无前导零的二进制&#xff0c;并保持year-month-day格式。 示例&#xff1a;输入2025-…...

基于Java+MySQL实现的医药销售管理系统

医药销售管理系统 开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称…...

HTML 列表:构建清晰结构的网页内容

引言 在网页开发过程中&#xff0c;将信息有条理地呈现给用户至关重要。HTML 列表作为一种强大的工具&#xff0c;能够使内容更加结构化和易于阅读。HTML 提供了有序列表、无序列表和自定义列表三种类型&#xff0c;满足不同场景下的内容展示需求。本文将深入探讨这三种列表的…...

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …...

基于“动手学强化学习”的知识点(六):第 19 章 目标导向的强化学习(gym版本 >= 0.26)

第 19 章 目标导向的强化学习&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&#xff01; 对应动手学强化学习——目标导向的强化学习 import torch…...

Vue 中的 MVVM、MVC 和 MVP 模式深度解析

文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…...

金融时间序列分析(Yahoo Finance API实战)

这里写目录标题 金融时间序列分析(Yahoo Finance API实战)1. 引言2. 项目背景与意义3. 数据集介绍4. GPU加速在数据处理中的应用5. 交互式GUI设计与加速处理6. 系统整体架构7. 数学公式与指标计算8. 完整代码实现9. 代码自查与BUG排查10. 总结与展望金融时间序列分析(Yahoo …...

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...

python socket库详解

socket是 Python 标准库中的一个模块&#xff0c;提供了对底层网络通信的接口&#xff0c;允许开发者进行网络编程。通过 socket你可以创建客户端和服务器应用程序&#xff0c;实现网络通信。 1. 基本概念 - Socket&#xff1a;是网络通信的端点&#xff0c;用于在不同主机之间…...

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …...

为什么 Young GC 比 Full GC 快

在 JVM 中&#xff0c;Young GC&#xff08;Minor GC&#xff09;比 Full GC 快很多&#xff0c;主要是因为两者在内存区域、回收对象的数量、算法复杂度等方面存在本质上的区别。 内存区域的区别 Young GC&#xff08;Minor GC&#xff09;只发生在新生代&#xff08;Young G…...

【愚公系列】《高效使用DeepSeek》009-PPT大纲自动生成

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了&#xff0c;接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能&#xff0c;逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧&#xff01; 功能讲解 开发环境&#xf…...

【虚幻C++笔记】枚举UENUM、结构体USTRUCT

目录 枚举(UENUM)第一种:使用命名空间第二种:继承uint8通过申明class类别名来替代 结构体(USTRUCT) 枚举(UENUM) 第一种:使用命名空间 UENUM(BlueprintType) namespace MyEnumType {enum MyCustomEnum{Type1,// 或者使用带 DisplayName别名 > Enum1 UMETA(DisplayName &q…...

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …...

Linux 下 MySQL 8 搭建教程

一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL&#xff1a; rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件&#xff1a; [roo…...

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用...

最新版VMware 17.6.3安装包分享

修复 Windows 11 主机无响应问题&#xff1a;Windows 11 主机锁定或解锁后&#xff0c;虚拟机可能变得无响应&#xff0c;此问题已在 17.6.3 版本中解决。 解决虚拟机启动崩溃问题&#xff1a;在某些系统上启动虚拟机后&#xff0c;Workstation Pro 可能会崩溃&#xff0c;新版…...