C++中文件操作与文件流

news2025/2/23 5:36:25

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰文件操作与文件流

🏡文件流类和文件流对象

🏡文件的打开与关闭

🌸1.文件的打开

🌸2.文件的关闭

🏡对文本文件的操作

🏡对二进制文件的操作

🌸1.用成员函数write和read操作二进制文件

🌸2.随机访问二进制文件


🐰文件操作与文件流

🏡文件流类和文件流对象

我们可以知道在标准设备为对象的输入输出中,必须定义流对象,如cin、cout就是流对象,C++是通过流对象进行输入输出的。同理,如果磁盘文件为对象进行输入输出,也必须先定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件或者从磁盘文件将数据输入到内存

由于cin和cout已经在iostream.h(iostream)中定义了,所以我们不需要定义就可以使用。但是文件流对象没有事先定义,必须由我们自己定义

例如:

ofstream outfile;  //输出文件流对象
fstream outfile;
ifstream infile;   //输入文件流对象
fstream infile;

🏡文件的打开与关闭

磁盘文件的打开与关闭使用fstream类中定义的成员函数open和close

🌸1.文件的打开

要对磁盘文件进行读写操作,首先必须打开文件打开文件就是将文件流对象与具体的磁盘文件建立关系,并指定使用方式。

(1)先定义一个fstream的对象,再调用该对象的成员函数open打开指定的文件。

例如

fstream outfile;//定义了fstream类(输入输出流)对象
outfile.open("test.txt",ios::out);//使文件流对象outfile与test.txt文件建立关系

open函数提供了两个参数:第一个参数是要被打开的文件名,使用文件名时可以包括路径,如"c:\\new\\f1.dat",第二个参数说明文件的访问方式。访问方式多种方式。

(2)在定义流对象时同时指定参数

在声明文件流类时定义了带参数的构造函数,其中包括了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的此构造函数来实现打开文件的功能。

例如

fstream outfile("test.txt",ios::out);

作用与open函数相同,参数含义相同

🌸2.文件的关闭

当结束一个磁盘文件的读写操作后,应该关闭文件。关闭文件用成员函数close。

例如:outfile.close

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    int n;
    double d;
    fstream out("test.txt",ios::out);
    out<<10<<endl;
    out<<10.1<<endl;
    out.close();
    fstream in("test.txt",ios::in);
    in>>n;
    in>>d;
    cout<<"n="<<n<<" "<<"d="<<d<<endl;
    return 0;
}
结果:
n=10 d=10.1

🏡对文本文件的操作

对文本文件的读写操作可以用流插入运算符"<<"和流提取运算符">>"输入输出标准类型数据。"<<"和">>"运算符已经在iostream中被重载,能够用于ostream和istream类对象的标准类型数据的输入输出。ifstream和ofstream分别是istream和ostream的派生类,它们从istream和ostraem类继承了公用的重载函数,所以在对磁盘文件的操作中,可以使用文件流对象和">>"以及"<<"实现磁盘文件的读写

对文本文件的读写操作也可以用文件流的put、get、getline等成员函数进行字符的输入输出。

例如:

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    char s[20];
    cout<<"请输入数据"<<endl;
    cin.getline(s,100,'\n');
    fstream op("test.txt",ios::out);//定义文件流对象op,以写入的方式打开磁盘文件"test.txt"
    if(!op)//如果打开失败,op返回0
    {
        cerr<<("打开文件失败")<<endl;
        exit(1);
    }
    op<<s;//向磁盘文件"test.txt"写入数据
    op.close();//关闭文件
    fstream op1;//定义了文件流对象op1
    op1.open("test.txt",ios::in);//以读出的方式打开磁盘文件"test.txt"
    if(!op1)//如果打开失败,op返回0
    {
        cerr<<("打开文件失败")<<endl;
        exit(1);
    }
    char ptr[20];
    op1.get(ptr,20,'\n');//将文件"test.txt"读出到字符数组ptr中
    cout<<"从文件得到的数据为"<<endl;
    cout<<ptr<<endl;//将ptr的数据输出到显示器上
    op1.close();//关闭文件
    return 0;
}
结果:
请输入数据
hello world
从文件得到的数据为
hello world

🏡对二进制文件的操作

二进制文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此又称为字节文件。对二进制文件的操作同样是使用时要先打开文件,用完要关闭文件。在打开时要用ios::binary指定为以二进制形式传递和存储。二进制文件除了作为输入文件或输出文件外,还可以既能输入又能输出的文件,这是和文本文件不同的地方

🌸1.用成员函数write和read操作二进制文件

向二进制文件中写入信息时,使用write函数,从二进制文件中读出信息,使用read函数。原型如下:

istream& read(char* buff,int length);
ostraem& write(const char* buff,int length);

buff:指向内存中一段存储空间

int length:读写的字节数

例如:

out.write(p1,30);//out是输出文件流对象,write函数将字符指p1所给的地址开始的20字节内容不加转换地写到磁盘文件中

in,read(p2,30);//in是输入文件流对象,read函数从in关联的磁盘文件中读取30个字节(或遇到EOF结束),存放在字符指针p2所指向的一段内存空间

例如:

#include<iostream>
#include<fstream>
using namespace std;
class Student//定义了学生类
{
private:
    long No;//学号(这里是整形的,根据需要也可以改成string型的)
    char* Name;//名字
    int Score;//成绩
public:
    Student(long stu_no=0,char* stu_name=NULL,int stu_score=0)//构造函数给数据成员赋值
    {
        No=stu_no;
        Name=stu_name;
        Score=stu_score;
    }
    //由于数据成员都是私有的,所以需要成员函数来实现私有数据在类外访问
    long GetNo()//返回学号
    {
        return No;
    }
    char* GetName()//返回名字
    {
        return Name;
    }
    int GetScore()//返回分数
    {
        return Score;
    }
    void Show()//显示一位学生的信息(学号、名字、成绩)
    {
        cout<<No<<" "<<Name<<" "<<Score<<endl;
    }
};
int main()
{
    Student stu[3]={{20090700,"liming",70},{20090702,"Hujun",80},{20090703,"Wangtian",90}};//定义了三个学生对象
    int k,pos;
    fstream out,in;//定义了输出和输入文件流的对象
    out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
    if(!out)
    {
        cerr<<"File open error!"<<endl;
        exit(-1);
    }
    for(int i=0;i<3;i++)//将三个学生信息写入文件test.txt
    {
        out.write((char*)&stu[i],sizeof(Student));
    }
    out.close();//关闭文件
    cout<<"test.txt:"<<endl;
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    Student s1[3];
    for(int i=0;i<3;i++)//将test.txt文件的内容读到对象数组s1中,再将s1数组的内容显示出来(s1的内容是三个学生的信息)
    {
        in.read((char*)&s1[i],sizeof(Student));
        cout<<s1[i].GetNo()<<" "<<s1[i].GetName()<<" "<<s1[i].GetScore()<<endl;
    }
    in.close();//关闭文件
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    cout<<"please input the number of record:";
    cin>>k;//k是第几个学生
    pos=(k-1)*sizeof(Student);//第k个学生的偏移量
    in.seekg(pos);//用成员函数seekg找到第k个学生的位置
    Student s2;
    in.read((char*)&s2,sizeof(Student));//将第k个学生的信息读到对象s2中
    cout<<s2.GetNo()<<" "<<s2.GetName()<<" "<<s2.GetScore()<<endl;//显示第k个学生的信息
    in.close();//关闭文件
    cout<<"Delete the Second record!"<<endl;//删除第二个学生的信息
    out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
    for(int i=0;i<3;i++)//将三个学生中除第二个学生的信息其他人的信息写到test.txt中(这里将覆盖原来test.txt的内容)
    {
        if(i!=1)
        {
            out.write((char*)&stu[i], sizeof(Student));
        }
    }
    out.close();//关闭文件
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    Student s3[2];//对象数组s3
    for(int i=0;i<2;i++)//显示删除第二个学生后的其他学生的信息
    {
        in.read((char*)&s3[i],sizeof(Student));
        cout<<s3[i].GetNo()<<" "<<s3[i].GetName()<<" "<<s3[i].GetScore()<<endl;
    }
    in.close();//关闭文件
    return 0;
}
结果:
test.txt:
20090700 liming 70
20090702 Hujun 80
20090703 Wangtian 90

🌸2.随机访问二进制文件

前面的例子都是顺序方式访问文件。但是对于二进制文件,还可以对它进行随机访问。在对一个二进制文件进行读写操作时,系统会为该文件设置一个读写指针,用于指示当前应进行读写的位置。在输入时每读入一个字节,指针就向移动一个字节。在输出时每向文件输出一个字节,指针就向后移动一个字节,随着输出文件中字节的不断增加,指针不断后移。文件流提供文件指针相关的成员函数。

文件指针有关的成员函数

 

其中,参数<文件中的位置>、<偏移量>都是long型量,并以字节为单位。<参照位置>可以被设置为以下3个值之一,它们是在ios类中定义的枚举常量:

1)ios::cur表示相对于文件的当前读指针位置

(2)ios::beg表示相对于文件的开始位置

(3)ios::end表示相对于文件的结尾位置

例如:

#include<iostream>
#include<fstream>
using namespace std;
class Student//定义了学生类
{
private:
    long No;//学号(这里是整形的,根据需要也可以改成string型的)
    char* Name;//名字
    int Score;//成绩
public:
    Student(long stu_no=0,char* stu_name=NULL,int stu_score=0)//构造函数给数据成员赋值
    {
        No=stu_no;
        Name=stu_name;
        Score=stu_score;
    }
    //由于数据成员都是私有的,所以需要成员函数来实现私有数据在类外访问
    long GetNo()//返回学号
    {
        return No;
    }
    char* GetName()//返回名字
    {
        return Name;
    }
    int GetScore()//返回分数
    {
        return Score;
    }
    void Show()//显示一位学生的信息(学号、名字、成绩)
    {
        cout<<No<<" "<<Name<<" "<<Score<<endl;
    }
};
int main()
{
    Student stu[3]={{20090700,"liming",70},{20090702,"Hujun",80},{20090703,"Wangtian",90}};//定义了三个学生对象
    int k,pos;
    fstream out,in;//定义了输出和输入文件流的对象
    out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
    if(!out)
    {
        cerr<<"File open error!"<<endl;
        exit(-1);
    }
    for(int i=0;i<3;i++)//将三个学生信息写入文件test.txt
    {
        out.write((char*)&stu[i],sizeof(Student));
    }
    out.close();//关闭文件
    cout<<"test.txt:"<<endl;
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    Student s1[3];
    for(int i=0;i<3;i++)//将test.txt文件的内容读到对象数组s1中,再将s1数组的内容显示出来(s1的内容是三个学生的信息)
    {
        in.read((char*)&s1[i],sizeof(Student));
        cout<<s1[i].GetNo()<<" "<<s1[i].GetName()<<" "<<s1[i].GetScore()<<endl;
    }
    in.close();//关闭文件
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    cout<<"please input the number of record:";
    cin>>k;//k是第几个学生
    pos=(k-1)*sizeof(Student);//第k个学生的偏移量
    in.seekg(pos);//用成员函数seekg找到第k个学生的位置
    Student s2;
    in.read((char*)&s2,sizeof(Student));//将第k个学生的信息读到对象s2中
    cout<<s2.GetNo()<<" "<<s2.GetName()<<" "<<s2.GetScore()<<endl;//显示第k个学生的信息
    in.close();//关闭文件
    cout<<"Delete the Second record!"<<endl;//删除第二个学生的信息
    out.open("test.txt",ios::out|ios::binary);//打开文件的方式是只写和二进制形式
    for(int i=0;i<3;i++)//将三个学生中除第二个学生的信息其他人的信息写到test.txt中(这里将覆盖原来test.txt的内容)
    {
        if(i!=1)
        {
            out.write((char*)&stu[i], sizeof(Student));
        }
    }
    out.close();//关闭文件
    in.open("test.txt",ios::in|ios::binary);//打开文件的方式是只读和二进制形式
    Student s3[2];//对象数组s3
    for(int i=0;i<2;i++)//显示删除第二个学生后的其他学生的信息
    {
        in.read((char*)&s3[i],sizeof(Student));
        cout<<s3[i].GetNo()<<" "<<s3[i].GetName()<<" "<<s3[i].GetScore()<<endl;
    }
    in.close();//关闭文件
    return 0;
}
结果:
test.txt:
20090700 liming 70
20090702 Hujun 80
20090703 Wangtian 90

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   

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

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

相关文章

Flink SQL 在美团实时数仓中的增强与实践

01 Flink SQL 在美团 目前 Flink SQL 在美团已有 100业务方接入使用&#xff0c;SQL 作业数也已达到了 5000&#xff0c;在整个 Flink 作业中占比 35%&#xff0c;同比增速达到了 115%。 SQL 作业的快速增长给我们带来了许多新的问题和挑战&#xff0c;主要包括以下几点&#…

CTR-GCN 论文解读

论文名称&#xff1a;Channel-wise Topology Refinement Graph Convolution for Skeleton-Based Action Recognition论文下载&#xff1a;https://arxiv.org/pdf/2107.12213.pdf论文代码&#xff1a;https://github.com/Uason-Chen/CTR-GCN CTR-GCN 是中科院自动化所发表在 IC…

项目二,easyx的加入

今天是项目的第二天 与昨天的迷离比起来今天大大的有进步 我对实现啥的功能有了一个基本的方案 1对所有路的查询那就是用dfs 2对最短路的查询就是用的floyed但是,查询是要保存路径的,所以想到了,保存每条最短路的时候 同时把最短路的前驱保存下来,我们可以通过前驱把完整的…

InnoDB中索引的实现

B树索引的使用 5.6.1 不同应用中B树索引的使用 在OLTP应用中&#xff0c;查询操作只从数据库中取得一小部分数据&#xff0c;一般可能都在10条记录以下&#xff0c;甚至在很多时候只取1条记录&#xff0c;如根据主键值来取得用户信息&#xff0c;根据订单号取得订单的详细信息…

Linux下最小化安装CentOS-7.6(保姆级)

文章目录安装包开始安装一、 新建一个虚拟机二、配置安装CentOS7.6二、开始安装CentOS三、配置CentOS并下载基本信息安装包 链接&#xff1a;https://pan.baidu.com/s/1DodB-kDy1yiNQ7B5IxwYyg 提取码&#xff1a;p19i 开始安装 一、 新建一个虚拟机 1、 打开VMWare&#x…

UVCCamera 源码解析

本文将通过UVCCamera源码研究 概述相机传感器数据采集至USB数据传输整个过程 下载源码配置调试环境 git clone GitHub - saki4510t/UVCCamera: library and sample to access to UVC web camera on non-rooted Android device 注释调原有 ndk-build编译方式 //tasks.with…

使用 /permissive- 编译器开关时变量名or被识别为关键字

使用 /permissive- 编译器开关时变量名被识别为关键字 VS2022已经默认开启对c14的支持。并且&#xff0c;一般同时开启的还有/permissive-开关。项目属性如下所示&#xff1a; 然而&#xff0c;在许多早期代码中&#xff0c;函数名和变量名使用了c14等新标准中的关键字&#…

德国访问学者申请签证事宜

德国访问学者长期签证所需材料,下面就随知识人网小编一起看一看。 1、护照及复印件两份。 2、申请表附加表两份(里面有好多注意事项&#xff0c;最重要的是用德文填写&#xff0c;当时我就谷歌翻译后写上去的&#xff0c;最后附加表上的地点&#xff0c;有好多人问填办大使馆还…

谷歌seo快速排名优化方法,谷歌seo需要哪些技术手段?

谷歌seo快速排名优化方法怎么做&#xff1f; 答案是&#xff1a;利用GLB推广技术可以实现谷歌快速排名。 具体请阅读&#xff1a;什么叫GLB外推&#xff1f; 你只想快速曝光你的企业品牌&#xff0c;GLB外推技术是一个不错的选择。 但如果你想优化自己的外贸官网&#xff0…

【springcloud】服务熔断——Hystrix

官方资料&#xff1a;Home Netflix/Hystrix Wiki GitHub 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务&#xff0c;这就是所谓的“扇出”&#xff0c;如果扇出的链路上某个微服务的调用响…

配置python的opencv环境

1、核心 opencv与numpy包的版本必须适配。核心包版本&#xff1a; numpy1.15.0 opencv4.1.0 2、创建opencv环境 (1)创建一个opencv的虚拟环境 conda create -n cv_python python3.6.0(2)激活虚拟环境 activate cv_python (3)安装numpy的1.15.0版本 pip install numpy1.1…

windows自定时间显示格式(将星期几调出来)

一般的情况下是不是显示星期几的 添加红色方框中的内容

ctfshow 愚人杯菜狗杯部分题目(flasksession伪造ssti)

目录 <1>愚人杯 (1) easy_signin (2) easy_ssti(无过滤ssti) (3) easy_flask(flash-session伪造) (4) easy_php(C:开头序列化数据) <2> 菜狗杯 (1) 抽老婆(flask_session伪造) (2) 一言既出&#xff0c;驷马难追(intval) (3) 传说之下&#xff08;js控制台&…

0101quick_find_union-union_find-动态连通性-算法研究

文章目录1 前言2 动态连通性3 算法3.1 算法设计3.1 union-find算法API3.2 数据结构和通用实现3.3 quick-find算法3.3.1 思想和实现3.3.2 分析3.4 quick-union算法3.4.1 算法描述3.4.2 算法实现3.4.3 性能分析结语1 前言 为了说明我们设计和分析算法的基本方法&#xff0c;我们…

通过SSD对齐功能轻松将 HDD 克隆到 SSD

由于 SSD 的优越性能&#xff0c;越来越多的用户正在考虑将他们的操作系统从 HDD 转移到 SSD。然而&#xff0c;一些用户反馈&#xff0c;在迁移之后&#xff0c;SSD 的启动速度并未提升。 为什么将操作系统从 HDD &#xff08;机械硬盘&#xff09;迁移到 SSD&#xff08;固态…

【leetcode hot 100】【7】11. 盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示…

JUC-多线程(11.面试问题简析)学习笔记

文章目录1. synchronized 关键字底层原理以及其与 lock 的区别2. 对CAS的理解以及底层实现原理3. ConcurrentHashMap实现线程安全的底层原理是什么4.对JDK中的AQS了解吗&#xff1f;AQS的实现原理是什么&#xff1f;5. 线程池的核心配置参数是干什么的&#xff1f;应该怎么用&a…

电子表格软件与一站式BI的区别

看完本节内容&#xff0c;相信您能够了解到电子表格软件&#xff08;代号电子表格软件&#xff09;与「一站式 BI」的主要区别。所谓一站式BI在官网上的名称就是Smartbi V10.5&#xff0c;代号就是Smartbi一直在使用insight。 这两个产品都属于商业智能BI软件的品类&#xff0…

文献阅读:Semantic Communications: Principles and Challenges

传统通信和语义通信的对比 语义信道容量&#xff08;从公式角度解释为什么语义通信的信道容量可以高于传统通信的信道容量&#xff09; 离散无记忆信道的语义信道容量表示为&#xff1a; Cssup⁡p(Z∣X){I(X;V)−H(Z∣X)HS(V)‾}C_s\sup _{p(Z \mid X)}\left\{I(X ; V)-H(Z \m…

再识华为云数据库——GaussDB

目录 一、GaussDB: 立足创新与自研&#xff0c;助力企业核心数据安全高效上云 二、GaussDB: 基于华为openGauss开放生态打造的 金融级分布式数据库 三、GaussDB(for MySQL): 基于开源生态打造的企业级自研云原生数据库 四、DRSUGO&#xff1a;数据库结构应用数据一站式迁移…