当前位置: 首页 > 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地址 要求划 分子网数 借用的主机位数 子网掩码 第…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...