stl 输入输出流

标准输入输出流

头文件 iostream

从标准输入读取流 cin >>

从标准输出写入流 cout <<

get 系列函数

get

无参数:cin.get() 从指定的输入流中提取一个字符(包括空白字符),若读取成功,返回该字符的 ASCII 值,若遇到文件结束符或读取错误,返回特殊值 EOF

有 1 个参数:cin.get(ch) 从输入流中读取一个字符赋给 ch

有 3 个参数:cin.get(字符数组,字符个数n,终止字符)

        cin.get(字符指针,字符个数n,终止字符) 从输入流中读取 n-1 个字符,赋给指定的字符数组/字符指针指向的数组,若在读取 n-1 个字符之前遇到指定的终止字符,则提前结束读取 遇到终止字符时,不读取终止字符,直接在字符串缓冲区尾部加结束标志 '\0'

getline

cin.getline(字符数组(或字符指针),字符个数n,终止标志字符) 从输入流中读取一行字符,用法与带 3 个参数的 get 函数类似 遇到终止字符时,读取终止字符,但不会将其存储到字符串缓冲区

流状态

  • goodbit:流未发生错误
  • eofbit:输入流遇到文件尾
  • failbit:流中发生格式错误,非致命错误,可挽回
  • badbit:发生数据丢失,致命错误,不可挽回

获取状态信息

int rdstate(); 无参数,返回值为状态信息特征值

检测输入输出状态

bool good(); 若返回 true,一切正常,没有错误发生

bool eof(); 若返回 true,表明已到达流的末尾

bool fail(); 若返回 true,表明 I/O 操作失败,主要原因是非法数据,但流可以继续使用

bool bad(); 发生了致命错误,流将不能继续使用

挽救方法

cin.clear(); 清除错误状态

cin.sync(); 清理错误字符

文件输入输出流

头文件:fstream

一个文件流对应一个物理文件

文件流只能按字符方式迭代

不同操作系统文件的编码模式不同

文件流有长度和索引两个属性

数据类型

数据类型

描述

ofstream

表示输出文件流,用于创建文件并向文件写入信息

ifstream

表示输入文件流,用于从文件读取信息

fstream

表示文件流,同时具有 ofstream 和 ifstream 两种功能,意味着其可以创建文件,向文件写入信息,从文件读取信息

打开文件

从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象

open

void open(const char *filename,ios::openmode mode);

第一个参数:指定要打开的文件的名称和位置

第二个参数:定义文件被打开的模式

模式标志

描述

ios::app

追加模式,所有写入都追加到文件末尾

ios::ate

文件打开后定位到文件末尾

ios::in

打开文件用于读取

ios::out

打开文件用于写入

ios::trunc

如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为0

PS:可以把以上两种或两种以上的模式结合使用,模式 A | 模式 B

is_open

is_open() 返回文件是否已经打开

关闭文件

当 C++ 程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件

close

void close();

#include<iostream>
#include<fstream>
using namespace std;
int main() {char szBuf[80];ifstream in("a.txt");//打开文本文件if (!in) {//判断读取是否成功cout << "文件不存在" << endl;return 0;}while (in.getline(szBuf, 80)) {//读取并输出文本文件中的内容cout << szBuf << endl;}in.close();//关闭文本文件return 0;
}

写入文件

使用流插入运算符 << 向文件写入信息

write(const char* buff,streamsize_t buffSize) 写入 nSize 字节数据到文件中

ostream& write(const char*,int nSize) 写二进制文件

#include<iostream>
#include<fstream>
using namespace std;
typedef struct Student {char StuName[20];int StuGrade;
}Student;
int main() {ofstream out;out.open("student.txt");//打开文本文件Student stu1 = { "张三", 90 };Student stu2 = { "李四", 80 };out << stu1.StuName << "\t" << stu1.StuGrade << endl;//把成绩信息存到文本文件out << stu2.StuName << "\t" << stu2.StuGrade << endl;out.close();//关闭文本文件return 0;
}
#include<iostream>
#include<fstream>
using namespace std;
typedef struct Student {char StuName[20];int StuGrade;
}Student;
int main() {ofstream out;out.open("student_2.txt");//打开文本文件Student stu1 = { "张三", 90 };Student stu2 = { "李四", 80 };out.write((const char*)&stu1, sizeof(Student));//把成绩信息存到二进制文件out.write((const char*)&stu2, sizeof(Student));out.close();//关闭文件return 0;
}

读取文件

使用流提取运算符 >> 从文件读取信息

read(const char* buff,streamsize_t buffSize) 读入最多 nSize 字节数据到 buff 中

istream& read(char*,int nSize) 读二进制文件

#include<iostream>
#include<fstream>
using namespace std;
typedef struct Student {char StuName[20];int StuGrade;
}Student;
int main() {ifstream in;in.open("student.txt");//打开文本文件if(!in)return 0;Student stu1;Student stu2;in >> stu1.StuName >>  stu1.StuGrade;//读文本文件信息in >> stu2.StuName >>  stu2.StuGrade;in.close();//关闭文本文件cout << "姓名:" << stu1.StuName << ' ' << "年龄:" << stu1.StuGrade << endl;//输出读取的信息cout << "姓名:" << stu2.StuName << ' ' << "年龄:" << stu2.StuGrade << endl;return 0;
}
#include<iostream>
#include<fstream>
using namespace std;
typedef struct Student {char StuName[20];int StuGrade;
}Student;
int main() {ifstream in;in.open("student_2.txt");//打开文本文件if (!in)return 0;Student stu1;Student stu2;in.read((char*)&stu1, sizeof(Student));//从二进制文件中读取成绩信息in.read((char*)&stu2, sizeof(Student));in.close();//关闭文件cout << "姓名:" << stu1.StuName << ' ' << "年龄:" << stu1.StuGrade << endl;//输出读取的信息cout << "姓名:" << stu2.StuName << ' ' << "年龄:" << stu2.StuGrade << endl;return 0;
}

文件位置指针

流的位置标识

ios::beg:流的开始位置

ios::cur:流的当前位置

ios::end:流的结束位置

定位函数

seekg

istream& seekg(long relativepos,ios::seek_dir dir)

针对输入流

参数:第一个参数是要移动的字符数目,可正可负;第二个参数是移动方向,使用三种流的位置标识中的一个

含义:字符指针相对于移动方向向前或向后移动了多少个字符

out.seekg(n); 定位到 out 的第 n 个字节

out.seekg(n,ios::cur); 把文件的读指针从 out 当前位置后移 n 个字节

out.seekg(n,ios::end); 把文件的读指针从 out 末尾往回移动 n 个字节

out.seekg(0,ios::end); 定位到 out 的末尾

seekp

ostream& seekp(long relativepos,ios::seek_dir dir)

针对输出流

参数:第一个参数是要移动的字符数目,可正可负;第二个参数是移动方向,使用三种流的位置标识中的一个

含义:字符指针相对于移动方向向前或向后移动了多少个字符

tellg

针对输入流

含义:返回该输入流的当前位置(距离文件的起始位置的偏移量)

tellp

针对输出流

含义:返回该输出流的当前位置(距离文件的起始位置的偏移量)

输入输出流中的缓冲 streambuf

STL 提供了缓冲区类 streambuf,提供给输入输出流使用,每个标准的输入输出流对象均包含一个 streambuf 指针

rdbuf

可以调用 rdbuf() 获取 streambuf 指针,从而直接访问底层 streambuf 对象

调用方法:

  • 无参数:返回调用者的流缓冲指针
  • 参数为流缓冲指针:使调用者与参数关联,返回自己当前关联的流缓冲区指针

字符串输入输出流

字符串输入输出流类直接对内存而不是对文件和标准输出进行操作

头文件:<sstream>

数据类型

数据类型

描述

istringstream

字符串输入流,提供读 string 功能

ostringstream

字符串输出流,提供写 string 功能

stringstream

字符串输入输出流,提供读写 string 功能

str

void str() 无参数,用于将 stringstream 流中的数据以 string 字符串的形式输出

void str(const string& s) 以字符串为参数,用以覆盖 stringstream 流中的数据

ss.str(""); 字符串流清零,将流中的数据全部清除

clear

作用:清除流的错误状态,主要用在 stringstream 重复使用或者多个 stringstream 对象构造时清空,否则之前的缓冲就停留在输入输出流中

对同一个 stringstream 对象重复赋值,需要对流使用 clear() 函数清空流的状态,此时流占用的内存没有改变,会一直增加【stringstream 不主动释放内存】,若想改变内存【一般是清除内存,减少内存消耗】,需要配合使用 str("") 清空 stringstream 的缓存

读取 string 对象

描述:

  • istringstream 从 string 对象中读取
  • 可以从流中提取数据,支持 >> 操作
#include<iostream>
#include<sstream>
using namespace std;
int main() {int n;float f;string strHello;string strText = "1 3.14 hello";istringstream s(strText);//从string对象中读取s >> n;//从流中提取数据s >> f;s >> strHello;cout << "n=" << n << endl;cout << "f=" << f << endl;cout << "strHello=" << strHello << endl;return 0;
}

写入 string 对象

描述:

  • ostringstream 写到 string 对象中
  • 可以把其他类型的数据写入流(往流中写入数据),支持<<操作;
#include<iostream>
#include<sstream>
using namespace std;
int main() {cout << "type an int,a float and a string:";int i;float f;string stuff;cin >> i >> f;getline(cin, stuff);ostringstream os;os << "integer=" << i << endl;//把数据写到流中os << "float=" << f << endl;os << "string=" << stuff << endl;string result = os.str();//写到string对象中cout << result << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文分享 | 利用单模态自监督学习实现多模态AVSR

本次分享上海交通大学发表在 ACL 2022 会议 的论文《Leveraging Unimodal Self-Supervised Learning for Multimodal AVSR》。该论文利用大规模单模态自监督学习构建多模态语音识别模型。 论文地址&#xff1a; https://aclanthology.org/2022.acl-long.308.pdf 代码仓库&am…

css 写带三角形的对话框,空心的三角形边框

首先&#xff0c;我们要会先实现一个小三角形&#xff1b; 思路&#xff1a;利用元素的 border 属性&#xff0c;将其三个方向的 border-color 值设为透明色&#xff08;或者和其父元素的背景色一致&#xff0c;形成视觉差&#xff0c;俗称障眼法&#xff09;&#xff0c;剩下…

操作系统学习笔记--进程与线程

进程 概念 不同的角度有不同的定义 进程是程序的一次执行过程进程是一个程序及其数据在处理机上顺序执行时所发生的活动进程是具有独立功能的程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位 进程&#xff1a;是动态的&#xff0c;是…

ESP-07S进行TCP 通信测试

一&#xff0c;TCP Server 为 AP 模式&#xff0c;TCP Client 为 Station 模式。 这里电脑pc作为TCP Server&#xff0c;ESP-07S作为TCP Client 。 二&#xff0c;电脑端配置。 1&#xff0c;开启热点。 2&#xff0c;转到“设置”&#xff0c;编辑热点信息。 3&#xff0c;关闭…

nio 文件传输

transferto方法一次只能传输2个g的数据 文件大于2个g时

动态壁纸软件iWall mac中文特色

iWall for mac是一款动态壁纸软件&#xff0c;它可以使用任何格式的漂亮视频(无须转换)&#xff0c;音频(可视化功能)&#xff0c;图片&#xff0c;动画&#xff0c;Flash&#xff0c;gif&#xff0c;swf&#xff0c;程序&#xff0c;网页&#xff0c;网站做为您的动态壁纸&…

90后整顿秦始皇老板

我的日常就像跑步机上急速前行的仓鼠&#xff0c;使劲往前冲&#xff0c;心有余力力有限。 我在一个电商运营公司做策划和写文案&#xff0c;每天总是加不完的班&#xff0c;从来没见过下午六点钟的太阳。 我做文案吗&#xff1f;唉&#xff0c;说实话&#xff0c;我倒觉得大…

HP打印机一点击打印就出现Windows资源管理器已停止工作问题解决

本次处理的打印机型号是HP Officejet 200 移动便携式打印机&#xff0c;不过其他型号如果出现类似现象&#xff0c;解决方法应该是一致的。 在弹出Windows资源管理器已停止工作的报错提示框后&#xff0c;点击左下角的详细信息&#xff0c;看到的内容显示是KernelBase.dll崩溃…

第二证券:汽车产业链股活跃,恒勃股份、博俊科技“20cm”涨停

轿车产业链股9日盘中走势活跃&#xff0c;截至发稿&#xff0c;恒勃股份、博俊科技“20cm”涨停&#xff0c;德迈仕涨超17%&#xff0c;上声电子涨超14%&#xff0c;川环科技涨超10%&#xff0c;圣龙股份、科华控股、沪光股份、上海沿浦、日盈电子、赛力斯等均涨停。 工作方面…

Feign(替代RestTemplate)远程调用

Feign初步学习 定义 Feign 是一个基于 Java 的 HTTP 客户端库&#xff0c;它是 Spring Cloud 中的一部分&#xff0c;用于简化微服务之间的 HTTP 通信。与传统的使用 RestTemplate 来调用 RESTful 服务不同&#xff0c;Feign 提供了一种声明式、基于接口的方式来定义和调用 H…

XLSX.utils.sheet_to_json()解析excel,给空的单元格赋值为空字符串

前言 今天用到XLSX来解析excel文件&#xff0c;调用XLSX.utils.sheet_to_json(worksheet)&#xff0c;发现如果单元格为空的话&#xff0c;解析出来的结果&#xff0c;就会缺少相应的key&#xff08;如图所示&#xff09;。但是我想要单元格为空的话&#xff0c;值就默认给空字…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)

一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式&#xff0c;手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录&#xff0c;HarmonyOS…

计算机竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

汽车烟雾测漏仪(EP120)

【汽车烟雾测漏仪&#xff08;EP120&#xff09;】 此烟雾测漏仪专为车辆管道&#xff08;油道、气道、冷却管道&#xff09; 的泄露检测而设计。适用于所有轻型 汽车、摩托车、轻卡、游艇等。 【特点】 具有空气模式和烟雾模式。空气模式&#xff0c;无需烟雾&#xff0c;检测…

接口自动化测试yaml+requests+allure技术,你学会了吗?

前言 接口自动化测试是在软件开发过程中常用的一种测试方式&#xff0c;通过对接口进行自动化测试&#xff0c;可以提高测试效率、降低测试成本。在接口自动化测试中&#xff0c;yaml、requests和allure三种技术经常被使用。 一、什么是接口自动化测试 接口自动化测试是指通…

vue实现自定义滚动条

vue实现自定义滚动条 具体效果如下&#xff0c;这边我用的rem单位&#xff0c;比例是1:40&#xff0c; 先写下页面布局&#xff0c;把原生的滚动条给隐藏掉&#xff0c;给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…

【DRAM存储器十三】DDR介绍

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR数据手册》 目录 DDR SDRAM芯片引脚 DDR SDRAM芯片框…

销售小白如何写客户拜访记录?

销售小白如何写客户拜访记录&#xff1f;10年客户管理经验&#xff0c;接下来我说的&#xff0c;都是实实在在的经验&#xff0c;小白能用到其中的40%&#xff0c;你的客户成单率会大大提升&#xff01; 首先&#xff0c;客户拜访记录的哪些信息是重要的&#xff1f; 答案是&…

ueditor

下载文件 文档 UEditor入门部署 入门部署和体验 1.1 下载编辑器 到官网下载 UEditor 最新版&#xff1a;http://ueditor.baidu.com/website/download.html#ueditor 1.2 创建demo文件 解压下载的包&#xff0c;在解压后的目录创建 demo.html 文件&#xff0c;填入下面的…

【轻松玩转MacOS】网络连接篇

引言 本篇让我们来聊聊网络连接。不论你是在家、在办公室&#xff0c;还是咖啡厅、机场&#xff0c;几乎所有的MacOS用户都需要连接到互联网。在这个部分&#xff0c;我们将向你展示如何连接到互联网和局域网。让我们开始吧&#xff01; 一、连接到互联网 首先&#xff0c;我…