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.rhkb.cn/news/153498.html

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

相关文章

Linux线程安全

线程安全 Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口互斥量实现原理探究 可重入VS线程安全概念常见的线程不安全的情况常见的线程安全的情况常见的不可重入的情况常见的可重入的情况可重入与线程安全联系可重入与线程安全区别 常见锁概念死锁死锁的四个…

ARM-流水灯

.text .global _start _start: 1、设置GPIOE寄存器的时钟使能 RCC_MP_AHB$ENSETR[4]->1 0x50000a28LDR R0,0X50000A28 LDR R1,[R0] 从R0起始地址的4字节数据取出放在R1 ORR R1,R1,#(0X3<<4) 第4位设置为1 STR R1,[R0] 写回2、设置PE10、PE8、PF10管脚为输出模式 …

靶场上新:PigCMS任意文件上传漏洞

本文由掌控安全学院-江月投稿 封神台新上线漏洞复现靶场&#xff1a;PigCMS action_flashUpload 任意文件上传漏洞。 漏洞详情&#xff1a; PigCms&#xff08;又称小猪CMS&#xff09;是一个基于phpmysql的多用户微信营销系统&#xff0c;是国内使用较多、功能强大、性能稳定…

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

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

jmeter生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

链表(7.27)

3.3 链表的实现 3.3.1头插 原理图&#xff1a; newnode为新创建的节点 实现&#xff1a; //头插 //让新节点指向原来的头指针&#xff08;节点&#xff09;&#xff0c;即新节点位于开头 newnode->next plist; //再让头指针&#xff08;节点&#xff09;指向新节点&#…

【亲测】简易商城小程序源码-易优CMS后台

易优小程序是基于前端开源小程序后端易优CMS标签化API接口&#xff0c; 是一套开源、快速搭建个性化需求的小程序CMS。轻量级TP底层框架&#xff0c;前后端分离&#xff0c; 标签化API接口可对接所有小程序&#xff0c;支持二次开发。即使小白用户也能轻松搭建制作一套完整的线…

实现一个简单的线性回归和多项式回归(2)

对于多项式回归&#xff0c;可以同样使用前面线性回归中定义的LinearRegression算子、训练函数train、均方误差函数mean_squared_error&#xff0c;生成数据集create_toy_data,这里就不多做赘述咯~ 拟合的函数为 def sin(x):y torch.sin(2 * math.pi * x)return y1.数据集的建…

go的面向对象学习

文章目录 面向对象编程(上)1.问题与解决思路2.结构体1》Golang语言面向对象编程说明2》结构体与结构体变量(实例/对象)的关系的示意图3》入门案例(using struct to solve the problem of cat growing) 3.结构体的具体应用4.创建结构体变量和访问结构体字段5.struct类型的内存分…

axios的get请求时数组参数没有下标

开发新项目过程中 发现get请求时 数组参数没有下标 这样肯定是不行的 后端接口需要数组[0]: 7 数组[1]:4这样的数据 原因是因为在请求拦截器没有处理需要的参数 解决方法 在请求拦截器 处理一下参数 import axios, { AxiosError, AxiosInstance, AxiosRequestHeaders } fro…

解决yolo无法指定显卡的问题,实测v5、v7、v8有效

方法1 基本上这个就能解决了&#xff01;&#xff01;&#xff01; 在train.py的最上方加上下面这两行&#xff0c;注意是最上面&#xff0c;其次指定的就是你要使用的显卡 import os os.environ[CUDA_VISIBLE_DEVICES]6方法2&#xff1a; **问题&#xff1a;**命令行参数指…

HTML5+CSSday4综合案例二——banner效果

bannerCSS展示图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…

Redis安装教程

官网地址 地址链接&#xff1a;传送门 安装步骤 这里有更多版本的选择 进去根据自己的需要选择版本&#xff0c;我这里用的7系列的稳定版。

AI视频监控平台EasyCVR接入海康SDK出现异常,该如何解决?

安防监控系统/视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。 有用户反馈&#xff0c;在使用视频监控系统EasyCVR接入…

汽车烟雾测漏仪(EP120)

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

打造虚拟企业展厅,开启商务活动新时代

引言: 虚拟企业展厅是一种基于数字技术的全新商务模式&#xff0c;正在改变传统商务活动的方式&#xff0c;它比传统的企业展厅更便利&#xff0c;也更能凸显企业优势&#xff0c;展示企业风貌。 一&#xff0e;虚拟企业展厅的好处 1.打破地域限制 传统的商务活动通常需要参…

12. Java异常及异常处理处理

Java —— 异常及处理 1. 异常2. 异常体系3. 常见Exception4. 异常处理4.1 try finally catch关键字4.2 throws和throw 自定义异常4.3 finally&#xff0c;final&#xff0c;finalize三者的区别 1. 异常 异常&#xff1a;在程序执行过程中发生的意外状况&#xff0c;可能导致程…

JVM命令行监控工具

JVM命令行监控工具 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。 Java作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注&#xff0c;可能…

vue3 集成 tailwindcss

tailwindcss 介绍 Tailwind CSS 是一个流行的前端框架&#xff0c;用于构建现代、响应式的网页和 Web 应用程序。它的设计理念是提供一组可复用的简单、低级别的 CSS 类&#xff0c;这些类可以直接应用到 HTML 元素上&#xff0c;从而加速开发过程并提高样式一致性。 主要特点…

超市微信小程序是怎么做的

市微信小程序是利用微信小程序平台为超市或零售商提供线上销售服务的一种应用。通过小程序&#xff0c;超市可以向消费者提供更加便捷、快速、个性化的购物体验&#xff0c;从而提升销售业绩、增加客户满意度。以下是超市微信小程序可以实现的一些主要功能。 一、商品展示与搜索…