14-1、IO流

news2024/11/29 0:30:22

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;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…

十九、FreeRTOS之FreeRTOS软件定时器

本节主要需要掌握以下内容&#xff1a; 1&#xff0c;软件定时器的简介&#xff08;了解&#xff09; 2&#xff0c;软件定时器的状态&#xff08;熟悉&#xff09; 3&#xff0c;单次定时器和周期定时器&#xff08;熟悉&#xff09; 4&#xff0c;软件定时器结构体成员介…

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中&#xff0c;我们做了一些GPU实例化的前置准备&…

查看NVIDIA CUDA版本号的四种方法

查看CUDA版本号这里有三种方法。 nvidia-smi 运行nvidia-smi命令&#xff1a; 右上角可以看到CUDA版本号。 CUDA Toolkit 下载地址&#xff1a;https://developer.nvidia.com/cuda-downloads $nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NV…

【数据结构 — 排序 — 交换排序】

数据结构 — 排序 — 交换排序 一.交换排序1.基本思想2.冒泡排序2.1.算法讲解2.2.代码实现2.2.1.函数定义2.2.2.算法接口实现2.2.3.测试代码实现2.2.4.测试展示 3.快速排序3.1.算法讲解3.2.各大算法分别单独实现3.2.1快速排序hoare版本3.2.2.快速排序hoare改进版三数取中选key法…

四:爬虫-Cookie与Session实战

四&#xff1a;Cookie与Session实战 ​ 在浏览网站的过程中&#xff0c;我们经常会遇到需要登录的情况&#xff0c;有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站&#xff0c;但是有时候过一段时间就需要重新登录。还有一些网站&#xff0c;在打开浏览器…

基于SSM框架的仓库管理系统

基于SSM框架的仓库管理系统 文章目录 基于SSM框架的仓库管理系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 现代商业环境中&#xff0c;仓库管理对于企业的运营效率和客户满意度至关重要。传统的手工管理方式已经无法满足日益复杂的仓储需求。…

51系列--基于MPX4250的压力计仿真设计

本文介绍基于MPX4250的压力计仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; MPX4250是一种线性度极强的一种压力传感器&#xff0c;它的线性范围为20-250kpa,测量范围也比较广泛&#xff0c;适用于大多数场合的压力检测。 仿真图如下 仿真运行视频 51系列…

项目记录:SpringBoot+Vue部署在阿里云服务器

目录 一、服务器配置 二、后端代码打包 三、前端项目打包 四、nginx配置 一、服务器配置 部署项目需要一个服务器&#xff0c;我们可以选择阿里云的云服务器ECS&#xff0c;在实例界面可以对服务器进行管理&#xff1a; 然后需要在mobaxterm配置jdk、mysql和nginx。注意配…

计算机毕业设计JAVA+SSM+springboot养老院管理系统

设计了养老院管理系统&#xff0c;该系统包括管理员&#xff0c;医护人员和老人三部分。同时还能为用户提供一个方便实用的养老院管理系统&#xff0c;管理员在使用本系统时&#xff0c;可以通过系统管理员界面管理用户的信息&#xff0c;也可以进行个人中心&#xff0c;医护等…

html网页设计 03表格

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>表格-名字</title></head><body><!-- cellspacing:单元格与单元格之间的间距 &#xff0c;默认是2个像素间距cellspadding:单元格与内容之间的间距&am…

微信小程序制作-背单词的小程序制作

微信小程序–背单词的 好久没有发过文章了&#xff0c;但是不代表着我不去学习了喽&#xff0c;以下是我最近做的东西&#xff0c;前端的UI由朋友设计的&#xff0c;目前这个是前端使用的是微信小程序后端是Python的一个轻量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

解决方案:aarch64 ARM架构下安装Miniconda + 离线迁移Conda环境的全流程 踩坑避坑指南

目录 一、安装Miniconda1.1、确认本机架构1.2、下载Miniconda安装包1.3、安装Miniconda 二、离线配置Conda环境2.1、查看本机配置2.2、迁移虚拟环境2.3、可能遇见的报错 最后 在ARM架构下&#xff0c;由于Anaconda并不提供官方的ARM版本&#xff0c;在很多情况下强行在ARM系统中…

实战演练 | 在 Navicat 中格式化日期和时间

Navicat 支持团队收到来自用户常问的一个问题是&#xff0c;如何将网格和表单视图中的日期和时间进行格式化。其实这个很简单。今天&#xff0c;我们将介绍在 Navicat Premium 中进行全局修改日期和时间格式的步骤。 如果你想边学边用&#xff0c;欢迎点击 这里 下载免费全功能…

四十三、Redis基础

目录 一、认识NoSql 1、定义&#xff1a; 2、常见语法 3、与关系型数据库&#xff08;SQL&#xff09;的区别&#xff1a; 二、认识Redis 1、定义&#xff1a; 2、特征&#xff1a; 3、Key的结构&#xff1a; 三、安装Redis 四、Redis常见命令 1、数据结构介绍 2、…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

改进的A*算法的路径规划(1)

引言 近年来&#xff0c;随着智能时代的到来&#xff0c;路径规划技术飞快发展&#xff0c;已经形成了一套较为 成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A*算法、D*算法、Field D* 算法等&#xff0c;然而传统的路径规划算法在复杂的场景的表现并不如人意&#xff…

项目二 创建与操作学生管理数据库

项目二 创建与操作学生管理数据库 #目标 创建库&#xff1b;查看库&#xff1b;操作库&#xff1b;图形工具操作库1&#xff0c;创建学生管理数据库 #创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collat…

开发猿的平平淡淡周末---2023/12/10

天气阴 温度适宜17摄氏度 AM 昨晚竟然下小雨了&#xff0c;还好还好&#xff0c;昨天刷的两个背包基本干了 一觉睡到日三竿&#xff0c;谁是神仙&#xff0c;我是神仙&#xff08;哈哈哈哈哈哈&#xff09; 刷会儿视频 补充下起床的动力 洗漱&#xff0c;恰饭&#xff0c;肝…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场&#xff08;deprecated&#xff09;GEORADIUS 获取指定成员附件的停车场&#xff08;deprecated&…