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.hqwc.cn/news/130335.html

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

相关文章

[LeetCode]链式二叉树相关题目(c语言实现)

文章目录 LeetCode965. 单值二叉树LeetCode100. 相同的树LeetCode101. 对称二叉树LeetCode144. 二叉树的前序遍历LeetCode94. 二叉树的中序遍历LeetCode145. 二叉树的后序遍历LeetCode572. 另一棵树的子树 LeetCode965. 单值二叉树 题目 Oj链接 思路 一棵树的所有值都是一个…

分库分表(3)——ShardingJDBC实践

一、ShardingSphere产品介绍 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由 JDBC、Proxy 和 Sidecar&#xff08;规划中&#xff09;这 3 款相互独立&#xff0c;却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分…

unity操作_光源组件 c#

准备工作 添加资源导入后先不管&#xff0c;现在主要学习自带Directional Light 我们首先创建一个平面Plane 然后重置一下位置 然后创建一个Cube 也重置一下位置然后修改y0.5刚好在这个平面上 ctrl d复制一个Cube 修改位置和旋转角度 给物体一个颜色 接下来创建一个点光源 我们…

安达发|制造业的新趋势:APS排程软件的广泛应用

近年来&#xff0c;随着科技的快速发展&#xff0c;制造业也在逐步实现智能化、自动化。其中&#xff0c;APS排程软件的应用越来越广泛&#xff0c;成为制造业提高生产效率、降低运营成本的重要工具。本文将深入探讨这一现象背后的原因。 制造业是全球经济的重要支柱&#xff0…

【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成

论文&#xff1a;https://arxiv.org/abs/2305.11147 代码&#xff1a;https://github.com/salesforce/UniControl#data-preparation docker快速部署&#xff1a;https://qq742971636.blog.csdn.net/article/details/133129146 文章目录 AbstractIntroductionRelated WorksUniCo…

Java基础——网络编程

网络通信要素一&#xff1a;IP地址或域名 IP作用&#xff1a;给网络中的一台计算机设备做唯一的编号。 IP分类&#xff1a; 方式一&#xff1a; IPv4&#xff08;占用4个字节&#xff09;IPv6&#xff08;占用16个字节&#xff09; 方式二&#xff1a; 公网地址&#xff08;万…

layui laydate实现日期选择并禁用指定的时间

最终实现禁用2023-9-26这天的效果 官网地址 日期和时间组件文档 - layui.laydate 下面是实现的代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet"…

Http请求响应 Ajax 过滤器

10/10/2023 近期总结&#xff1a; 最近学的后端部署&#xff0c;web服务器运行&#xff0c;各种请求响应&#xff0c;内容很多&#xff0c;学的很乱&#xff0c;还是需要好好整理&#xff0c;前面JavaSE内容还没有完全掌握&#xff0c;再加上一边刷题&#xff0c;感觉压力很大哈…

Python接口自动化测试之token参数关联

前言 在做自动化接口测试时&#xff0c;有时候会遇到token的动态关联&#xff0c;例如查询余额接口&#xff0c;需要关联登录接口的token动态值&#xff0c;如何利用python脚本进行接口token关联呢?今天我们爱学习一下吧&#xff01; 一&#xff1a;获取登录接口返回的token…

【Java 进阶篇】CSS 选择器详解

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页上元素样式的语言。要想有效地使用CSS&#xff0c;了解CSS选择器是至关重要的&#xff0c;因为它们允许你选择要应用样式的HTML元素。在本文中&#xff0c;我们将详细介绍CSS选择器的各种类型和用法&#xff0c;以便你…

【每日一记】OSPF区域划分详讲、划分区域的优点好处

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

3d环形图开发(vue3+vite+ts)

开发效果&#xff08;待完善&#xff09;&#xff1a; 技术支持&#xff1a; Echarts echarts-gl 安装&#xff1a; 注&#xff1a;echarts与echarts-gl版本需对应&#xff0c;可参考官网 pnpm add echarts4.9.0 echarts-gl1.1.2 组件封装&#xff1a; <template><…