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

14-1、IO流

14-1、IO流

  • lO流打开和关闭
    • lO流打开模式
    • lO流对象的状态
  • 非格式化IO
  • 二进制IO
    • 读取二进制数据
    • 获取读长度
    • 写入二进制数据
  • 读写指针 和 随机访问
    • 设置读/写指针位置
    • 获取读/写指针位置
  • 字符串流

lO流打开和关闭

通过构造函数打开I/O流
其中filename表示文件路径,mode表示打开模式

  • 打开输入流
    ifstream (const char* filename ,openmode mode)
  • 打开输出流
    ofstream(const char* filename , openmode mode);
  • 打开输入输出流
    fstream (const char* filename , openmode mode);

lO流打开模式

  • ios::out
    打开文件用于写入,不存在则创建,存在则清空
    适用于ofstream(缺省)/fstream
  • ios::app
    打开文件用于追加,不存在则创建,存在不清空
    适用于ofstream/fstream
  • ios::trunc
    打开时清空原内容
    适用于ofstream/fstream
  • ios:in
    打开文件用于读取,不存在则失败,存在不清空
    适用于ifstream(缺省)/fstream
  • ios::ate
    打开时定位文件尾
    适用于ifstream/fstream
  • ios.:binary
    以二进制模式读写
    适用于ifstream/ofstream/fstream
#include <iostream>
#include <fstream>
using namespace std;
// C++标准库已经设计好的类ofstream(文件输出流)类int main( void ){ofstream ofs1("./file",ios::out);if(!ofs1){ // !(ofs1.operator bool())cout << "ofs1流对象状态错误 -- 打开文件失败" << endl;}ofs1 << 1234 << ' ' << 56.78 << ' ' << "Hello" << '\n';if(!ofs1){cout << "ofs1流对象状态错误 -- 写文件失败" << endl;}ofs1.close();ofstream ofs2("./file",ios::app);if(!ofs2){ // !(ofs2.operator bool())cout << "ofs2流对象状态错误 -- 打开文件失败" << endl;}ofs2 << "World" << endl;;if(!ofs2){cout << "ofs2流对象状态错误 -- 写文件失败" << endl;}ofs2.close();return 0;
} 
#include <iostream>
#include <fstream>
using namespace std;
// C++标准库已经设计好的类ifstream(文件输入流)类int main( void ){ifstream ifs1("./file",ios::in);if(!ifs1){ // !(ifs1.operator bool())cout << "ifs1流对象状态错误 -- 打开文件失败" << endl;}int i; double d; string s1,s2;ifs1 >> i >> d >> s1 >> s2;if(!ifs1){cout << "ifs1流对象状态错误 -- 读文件失败" << endl;}cout << i << ' ' << d << ' ' << s1 << ' ' << s2 << endl;ifs1.close();ifstream ifs2("./file",ios::ate);if(!ifs2){ // !(ifs2.operator bool())cout << "ifs2流对象状态错误 -- 打开文件失败" << endl;}ifs2.seekg(0,ios::beg);int ii; double dd; string ss1,ss2;ifs2 >> ii >> dd >> ss1 >> ss2;if(!ifs2){cout << "ifs2流对象状态错误 -- 读文件失败" << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.close();return 0;
} 

lO流对象的状态

I/O流类对象内部保存当前状态,其值为以下常量的位或

  • ios:goodbit: 0,一切正常
  • ios::badbit: 1,发生致命错误
  • ios::eofbit: 2,遇到文件尾
  • ios::failbit: 4,打开文件失败或实际读写字节数未达预期
    在这里插入图片描述

l/O流类对象支持到bool类型的隐式转换

  • 发生1,2,4等情况,返回false,否则返回true
  • 将I/O流对象直接应用到布尔上下文中,即可实现转换

处于1或4状态的流,在复位前无法工作

#include <iostream>
#include <fstream>
using namespace std;
// C++标准库已经设计好的类ifstream(文件输入流)类int main( void ){ifstream ifs2("./file",ios::ate);if(!ifs2){ // !(ifs2.operator bool())cout << "ifs2流对象状态错误 -- 打开文件失败" << endl;}int ii; double dd; string ss1,ss2;cout << "--------------------第一次读数据-----------------------" << endl;ifs2 >> ii >> dd >> ss1 >> ss2;// ifs2.operator>>(ii).operator>>(dd)>>operator>>(ss1)>>operator>>(ss2)if(!ifs2){cout << "ifs2流对象状态错误 -- 读文件失败" << endl;cout << "ifs2是0状态吗?" << ifs2.good() << ", ifs2是1状态吗?" << ifs2.bad()<< ", ifs2是2状态吗?" << ifs2.eof() << ", ifs2是4状态吗?" << ifs2.fail() << endl;cout << "ifs2的具体状态:" << ifs2.rdstate() << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.clear();ifs2.seekg(0,ios::beg);cout << "--------------------第二次读数据-----------------------" << endl;ifs2 >> ii >> dd >> ss1 >> ss2;// ifs2.operator>>(ii).operator>>(dd)>>operator>>(ss1)>>operator>>(ss2)if(!ifs2){cout << "ifs2流对象状态错误 -- 读文件失败" << endl;cout << "ifs2是0状态吗?" << ifs2.good() << ", ifs2是1状态吗?" << ifs2.bad()<< ", ifs2是2状态吗?" << ifs2.eof() << ", ifs2是4状态吗?" << ifs2.fail() << endl;cout << "ifs2的具体状态:" << ifs2.rdstate() << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.close();return 0;
} 

非格式化IO

  • 写入字符
    ostream& ostream::put (char ch);一次向输出流写入一个字符,返回流本身
  • 刷输出流
    ostream& ostream::flush (void);将输出流缓冲区中的数据刷到设备上,返回流本身
  • 读取字符
    int istream::get (void);成功返回读到的字符,失败或遇到文件尾返回EOF
    istream& istream::get (char& ch);返回输入流本身,其在布尔上下文中的值,成功为true,失败或遇到文件尾为false
  • 读取行
    istream& istream::getline (char* buffer,streamsize num, char delim = ‘\ n’);
    • 读取字符 (至定界符)到buffer中。
    • 一旦读取了num个字符还未读取定界符,第num个字符设置为 ‘\0’,返回 (输入流对象状态为4)。
    • 如果因为遇到定界符 (缺省为 ‘\n’ ) 返回 (输入流对象状态为0)定界符被读取并丢弃,追加结尾空字符 ‘\0’,读指针停在该定界符的下一个位置
    • 遇到文件尾,返回 (输入流对象状态为6)
#include <iostream>
#include <fstream>
using namespace std;// C++标准库已经设计好的类ofstream(文件输出流)、ifstream(文件输入流)类int main( void ){ofstream ofs("./noformat",ios::out);if(!ofs)cout << "ofs流对象状态错误 -- 打开文件失败" << endl;for( char c = ' '; c <= '~';c++)ofs.put(c).flush();ofs.close();ifstream ifs("./noformat",ios::in);if(!ifs)cout << "ifs流对象状态错误 -- 打开文件失败" << endl;char c;// 单參getwhile(1){ifs.get(c);if(!ifs)break;elsecout << c;}cout << endl;ifs.clear();ifs.seekg(0,ios::beg);// 无參getwhile(1){c = ifs.get();if( c == EOF )break;elsecout << c;}cout << endl;ifs.close();return 0;
} 
#include <iostream>
#include <fstream>
using namespace std;// C++标准库已经设计好的类ofstream(文件输出流)、ifstream(文件输入流)类int main( void ){ifstream ifs("./getline",ios::in);if(!ifs)cout << "ifs流对象状态错误 -- 打开文件失败" << endl;char buf[256];while(1){ifs.getline(buf,256,'\n');if(!ifs)break;else{cout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;}}
/*ifs.getline(buf,256,'\n'); // aa\ncout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // bbbb\ncout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // cccccc\ncout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // dddddddd\ncout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // 0123456789\ncout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // cout << buf << endl;cout << "ifs流对象状态值:" << ifs.rdstate() << endl;
*/    ifs.close();return 0;
} 

二进制IO

读取二进制数据

istream& istream::read (char* buffer,streamsize num)
  • 从输入流中读取num个字节到缓冲区buffer中
  • 返回流对象本身,其在布尔上下文中的值,成功(读满)为true,失败(没读满)为false
  • 如果没读满num个字节,函数就返回了,比如遇到文件尾,最后一次读到缓冲区,buffer中的字节数可以通过istream::gcount()函数获得
#include <iostream>
#include <fstream>
using namespace std;// C++标准库已经设计好的类ofstream(文件输出流)、ifstream(文件输入流)类int main( void ){ofstream ofs("./binary",ios::out);if(!ofs)cout << "ofs流对象状态错误 -- 打开文件失败" << endl;ifstream ifs("./getline",ios::in);if(!ifs)cout << "ifs流对象状态错误 -- 打开文件失败" << endl;char buf[3];while(1){ifs.read(buf,3);if(ifs){ofs.write(buf,3);
//          cout << buf; // 读满3个字符}else{// 没有读满3个字符int len = ifs.gcount();ofs.write(buf,len);
//          buf[len]='\0';
//          cout << buf;break;}}ifs.close();ofs.close();return 0;
} 

获取读长度

streamsize istream::gcount (void)

返回最后一次从输入流中读取的字节数

写入二进制数据

ostream& ostream::write (const char* buffer,streamsize num);
  • 将缓冲区buffer中的num个字节写入到输出流中
  • 返回流本身,其在布尔上下文中的值,成功(写满)为true,失败(没写满)为false
#include <iostream>
#include <fstream>
using namespace std;// C++标准库已经设计好的类ofstream(文件输出流)、ifstream(文件输入流)类int main( void ){ofstream ofs("./binary",ios::out);if(!ofs)cout << "ofs流对象状态错误 -- 打开文件失败" << endl;ifstream ifs("./getline",ios::ate);if(!ifs)cout << "ifs流对象状态错误 -- 打开文件失败" << endl;int size = ifs.tellg();char buf[size];ifs.seekg(0,ios::beg);ifs.read(buf,size);ofs.write(buf,size);ifs.close();ofs.close();return 0;
} 

读写指针 和 随机访问

设置读/写指针位置

istream& istream::seekg (off_type offset,ios::seekdir origin);
ostream& ostream::seekg (off_type offset,ios::seekdir origin);

origin表示偏移量offset的起点:

  • ios::beg从文件的第一个字节
  • ios::cur从文件的当前位置
  • ios::end从文件最后一个字节的下一个位置
    offset为负/正表示向文件头/尾的方向偏移
    读/写指针被移到文件头之前或文件尾之后,则失败

获取读/写指针位置

返回读/写指针当前位置相对于文件头的字节偏移量

pos type istream::tellg (void);
pos type ostream::tellp (void):

字符串流

输出字符串流

#include <sstream>
ostringstream oss ;
oss << 1234 << ' ' << 56.78 <<' '<< "ABCD";
string os = oss.str();

输入字符串流

#include <sstream>
string is ("1234 56.78 ABCD") ;
istringstream iss (is);
int i;
double d;
string s;
iss >> i >> d >> s;

相关文章:

14-1、IO流

14-1、IO流 lO流打开和关闭lO流打开模式lO流对象的状态 非格式化IO二进制IO读取二进制数据获取读长度写入二进制数据 读写指针 和 随机访问设置读/写指针位置获取读/写指针位置 字符串流 lO流打开和关闭 通过构造函数打开I/O流 其中filename表示文件路径&#xff0c;mode表示打…...

每日一道算法题 1

借鉴文章&#xff1a;Java-敏感字段加密 - 哔哩哔哩 题目描述 给定一个由多个命令字组成的命令字符串&#xff1b; 1、字符串长度小于等于127字节&#xff0c;只包含大小写字母&#xff0c;数字&#xff0c;下划线和偶数个双引号 2、命令字之间以一个或多个下划线_进行分割…...

【网络奇缘】- 计算机网络|深入学习物理层|网络安全

​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 回顾链接&#xff1a;http://t.csdnimg.cn/ZvPOS 这篇文章是关于深入学习原理参考模型-物理层的相关知识点&…...

❀expect命令运用于bash❀

目录 ❀expect命令运用于bash❀ expect使用原理 expet使用场景 常用的expect命令选项 Expect脚本的结尾 常用的expect命令选参数 Expect执行方式 单一分支语法 多分支模式语法第一种 多分支模式语法第二种 在shell 中嵌套expect Shell Here Document&#xff08;内…...

2023年团体程序设计天梯赛——总决赛题

F-L1-1 最好的文档 有一位软件工程师说过一句很有道理的话&#xff1a;“Good code is its own best documentation.”&#xff08;好代码本身就是最好的文档&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一…...

K8S 工具收集

杂货铺&#xff0c;我不用 K8S&#xff0c;把见过的常用工具放在这里&#xff0c;后面学的时候再来找 名称描述官网Pixie查看 k8s 的工具。集群性能、网络状态、pod 状态、热点图等HomeKubernetes Dashboard基于 Web 的 Kubernetes 集群用户界面。GithubGardenerSAP 开源的 K8…...

自动化测试之读取配置文件

前言&#xff1a; 在日常自动化测试开发工作中&#xff0c;经常要使用配置文件&#xff0c;进行环境配置&#xff0c;或进行数据驱动等。我们常常把这些文件放置在 resources 目录下&#xff0c;然后通过 getResource、ClassLoader.getResource 和 getResourceAsStream() 等方法…...

如何实现分布式调用跟踪?

分布式服务拆分以后&#xff0c;系统变得日趋复杂&#xff0c;业务的调用链也越来越长&#xff0c;如何快速定位线上故障&#xff0c;就需要依赖分布式调用跟踪技术。下面我们一起来看下分布式调用链相关的实现。 为什么需要分布式调用跟踪 随着分布式服务架构的流行&#xf…...

接口的性能优化(从前端、后端、数据库三个角度分析)

接口的性能优化&#xff08;前端、后端、数据库&#xff09; 主要通过三方面进行优化 前端后端数据库 前端优化 接口拆分 不要搞一个大而全的接口&#xff0c;要区分核心与非核心的接口&#xff0c;不然核心接口就会被非核心接口拖累 或者一个接口中大部分返回都很快&…...

区块链扩容问题研究【06】

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…...

英语论文写作常用词汇积累

baseline&#xff1a;比较算法好坏中作为“参照物”而存在&#xff0c;在比较中作为基线&#xff1b;目的是比较提出算法的性能或者用以彰显所提出的算法的优势&#xff1b; benchmark&#xff1a;评价算法好坏的一种规则和标准。是目前的模型能做到的比较好的效果&#xff1b…...

redis集群(cluster)笔记

1. 定义&#xff1a; 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序…...

css 元素前后添加图标(::before 和 ::after 的妙用)

<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…...

C++ 设计模式 Forward Declaration Pimpl

放几轮跟 chatgpt 的对话&#xff0c;很精彩的回答 You 我有个问题&#xff0c;我的 main 目标依赖 src/gcp_subscriber.h 的 GCPSubscriber class 这个 class 有个 private 成员 google::cloud::pubsub::Subscriber 也就意味着我得在 gcp_subscriber.h 里面引用 google clou…...

【uniapp】小程序开发8:滚动组件scroll-view

我们经常需要做页面中部分内容可以滚动的功能&#xff0c;例如“猜你喜欢”&#xff0c;内容太多&#xff0c;通常都会超出屏幕&#xff0c;那么此块区域应该可以滚动&#xff0c;但是顶部的自定义导航栏应该不能随着滚动。 这个时候&#xff0c;就可以使用uniapp提供的滚动组件…...

Java王者荣耀火柴人

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造成基础伤害。小…...

1.鸿蒙应用程序开发app_hap开发环境搭建

1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发&#xff0c;提供了代码智能编辑、低代…...

JDK多版本集成 Jacoco 配置指南

JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下&#xff1a; JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析&#xff08;在代码执行时收集数据&#xff09;来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…...

容器及容器调度(云)

在云计算中&#xff0c;容器是一种轻量级、可执行的软件包&#xff0c;它包含应用程序及其全部依赖项&#xff0c;包括库、二进制文件、配置文件等。容器与虚拟机不同&#xff0c;因为它们不需要包含完整的操作系统&#xff1b;相反&#xff0c;所有容器都共享主机操作系统的内…...

实验七 子网的划分

实验七 子网的划分 实验目的掌握划分子网的方法实验内容划分给定IP地址的子网将划分后的子网应用到网络环境中实验要求每位同学从下表中至少选择一行进行子网划分,并填写所选择行的剩余部分。(注意:子网号全0的不用)标准IP地址 要求划 分子网数 借用的主机位数 子网掩码 第…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...