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;
    // 单參get
    while(1){
        ifs.get(c);
        if(!ifs)
            break;
        else
            cout << c;
    }
    cout << endl;

    ifs.clear();
    ifs.seekg(0,ios::beg);
    // 无參get
    while(1){
        c = ifs.get();
        if( c == EOF )
            break;
        else
            cout << 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\n
    cout << buf << endl;
    cout << "ifs流对象状态值:" << ifs.rdstate() << endl;

    ifs.getline(buf,256,'\n'); // bbbb\n
    cout << buf << endl;
    cout << "ifs流对象状态值:" << ifs.rdstate() << endl;

    ifs.getline(buf,256,'\n'); // cccccc\n
    cout << buf << endl;
    cout << "ifs流对象状态值:" << ifs.rdstate() << endl;

    ifs.getline(buf,256,'\n'); // dddddddd\n
    cout << buf << endl;
    cout << "ifs流对象状态值:" << ifs.rdstate() << endl;

    ifs.getline(buf,256,'\n'); // 0123456789\n
    cout << 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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PWN】学习笔记(二)【栈溢出基础】

课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…

前端mp3文件转wav文件的实现

一、音频文件格式转换 1&#xff09;安装fluent-ffmpeg和ffmpeg插件 npm install fluent-ffmpeg; npm install ffmpeg;2&#xff09;mp3转wav test.js文件&#xff1a; const ffmpeg require(fluent-ffmpeg);ffmpeg(./test.mp3) .format(wav) .audioBitrate(16k) .audioFre…

Shutter的安装及使用

概要&#xff1a;本篇主要讲述截图软件Shutter的安装和使用&#xff0c;操作系统是Ubuntu22.04 一、安装 sudo apt install shutter 二、区域截图 1、打开Shutter&#xff0c;点击Selection 2、提示信息 3、框选矩形区域 按住鼠标左键&#xff0c;拖动鼠标&#xff0c;松…

基于SSM的健身房预约系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

@Styles和@Extend的区别(鸿蒙开发)

如果每个组件的样式都需要单独设置&#xff0c;在开发过程中会出现大量代码在进行重复样式设置&#xff0c;虽然可以复制粘贴&#xff0c;但为了代码简洁性和后续方便维护&#xff0c;我们推出了可以提炼公共样式进行复用的装饰器Styles。 Styles装饰器可以将多条样式设置提炼成…

模型 心流

本系列文章 主要是 分享模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。完全投入其中。 1 心流的应用 1.1 优秀运动员的心流体验 迈克尔乔丹&#xff08;Michael Jordan&#xff09;&#xff1a;篮球之神乔丹在比赛中经常进入心流状态&#xff0c;他曾表示&#xff…

Java_LinkedList链表详解

目录 前言 ArrayList的缺陷 链表 链表的概念及结构 链表的种类 1.单向或双向 2.带头或不带头 3.循环或不循环 LinkedList的使用 什么是LinkedList LinkedList的使用 LinkedList的构造 LinkedList的其他常用方法介绍 LinkedList的遍历 ArrayList和LinkedList的…

1833_emacs_smex的替代品counsel

Grey # :OPTIONS ^:nil emacs smex的替代品counsel 尝试原因 之前使用emacs的生涯中&#xff0c;大部分时间都在使用spacemacs的配置。由于自己对于设计实现的一点好奇&#xff0c;加上spacemacs配置过于庞大&#xff0c;催生了自己维护一套精简够用的配置的想法。这个配置…

Netty源码学习7——netty是如何发送数据的

一丶Write事件的产生和传播 在业务逻辑处理完毕后&#xff0c;需要调用write 或者 writeAndFlush方法 ChannelHandlerContext#write or writeAndFlush方法会从当前 ChannelHandler 开始在 pipeline 中向前传播 write 事件直到 HeadContext。 ChannelHandlerContext.channel()#…

Leetcode100 链表|2. 两数相加160. 相交链表 234. 回文链表

2. 两数相加 题目&#xff1a;给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

JAVA高级(后端需深入移步)

单元测试&#xff1a;使用Junit单元测试框架 使用Junit单元测试&#xff1a; 通过左侧的对❌来进行提示 Junit框架的常见注解&#xff1a; 反射&#xff08;用于框架&#xff0c;也是最重要&#xff09;&#xff1a;展示框架的成员信息 由于是用于对象&#xff0c;即使在获取…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…

m.2固态硬盘怎么选择?

一、什么是固态硬盘 固态硬盘又称SSD&#xff0c;是Solid State Drive的简称&#xff0c;由于采用了闪存技术&#xff0c;其处理速度远远超过传统的机械硬盘&#xff0c;这主要是因为固态硬盘的数据以电子的方式存储在闪存芯片中&#xff0c;不需要像机械硬盘那样通过磁头读写磁…

五:爬虫-数据解析之xpath解析

三&#xff1a;数据解析之xpath解析 1.xpath介绍&#xff1a; ​ xpath是XML路径语言&#xff0c;它可以用来确定xml文档中的元素位置&#xff0c;通过元素路径来完成对元素的查找&#xff0c;HTML就是XML的一种实现方式&#xff0c;所以xpath是一种非常强大的定位方式​ XPa…

LeetCode5.最长回文子串

昨天和之前打比赛的队友聊天&#xff0c;他说他面百度面到这道算法题&#xff0c;然后他用暴力法解的&#xff0c;面试官让他优化他没优化出来&#xff0c;这道题我之前没写过&#xff0c;我就想看看我能不能用效率高一点的方法把它做出来&#xff0c;我一开始就在想用递归或者…

FreeSSL申请免费域名证书

本文详细讲解如何申请免费证书&#xff0c;需要先准备好域名&#xff0c;将服务器IP和域名绑定。 1、注册FreeSSL账号 网址&#xff1a; https://freessl.org/ 2、申请流程 登录后首页输入域名&#xff0c;然后点击Create certificate&#xff0c;跳转到证书申请页面。 或者…

使用最小花费爬楼梯

1.状态表示 2.状态转移方程 3.初始化 保证填表时&#xff0c; 不越界 4.填表顺序 从左往右 5.返回值 解法2&#xff1a; 1.状态表示 2.状态转移方程 3.初始化 4.填表 从右往左 5.返回值 min( dp[0] , dp[1] ) ----------------------------------------------------…

基于TCP的多路复用

1. 知识点 目前支持I/O多路复用的系统调用有select&#xff0c;pselect&#xff0c;poll&#xff0c;epoll。与多进程和多线程技术相 比&#xff0c;I/O多路复用技术的最大优势是系统开销小&#xff0c;系统不必创建进程/线程&#xff0c;也不必维护这些进 程/线程&#xff0c;…

Spring Boot中的事务是如何实现的?懂吗?

SpringBoot中的事务管理&#xff0c;用得好&#xff0c;能确保数据的一致性和完整性&#xff1b;用得不好&#xff0c;可能会给性能带来不小的影响哦。 基本使用 在SpringBoot中&#xff0c;事务的使用非常简洁。首先&#xff0c;得感谢Spring框架提供的Transactional注解&am…

Proteus仿真--串口发送数据到2片8×8点阵屏滚动显示

本文介绍2片88点阵屏滚动显示设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 仿真运行视频 Proteus仿真--1602LCD显示电话拨号键盘按键实验&#xff08;仿真文件程序&#xff09; 附完整Proteus仿真资料代码资料 链接&#xff1a;https://pan.baidu…