【C++知识点】文件操作
✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:C/C++知识点
📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~
文件操作
数据流的概念
数据流(data stream)是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
c++通过一种称为流(stream)的机制提供了更为精良的输入和输出方法。流是一种灵活且面向对象的I/O方法。
根据操作对象不同分为文件流、字符串流、控制台流。
控制台流
C++输入输出操作分别是由istream(输入流)和ostream(输出流)这两个类提供的,为了允许双向的输入/输出,由istream和ostream派生出了iostream类。
类的继承关系如下图:
是一种多继承的关系,在程序应用可以只包含头文件iostream。
上面的<<和>>操作符,是因为iostream.h头文件中,ostream类对应每个基本数据类型都有其友元函数对左移操作符进行了友元函数的重载。
文件流
文件流的输入输出类在fstream头文件被定义,和控制台流继承关系为:
由于文件设备不像显示器屏幕和键盘那样标准的默认设备,所以我们定义一个流对象。
ofstream类的默认构造函数原形为:
ofstream::ofstream(constchar *filename,int mode = ios::out, int penprot = filebuf::openprot);
mode属性表:
打开文件属性值:
“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。文件使用完后可以使用close成员函数关闭文件。
ios::app为追加模式,在使用追加模式的时候同时进行文件状态的判断是一个比较好的习惯。
字符串流
字符串流就是能够控制字符串类型对象进行输入输出的类,C++不光可以支持C++风格的字符串流控制,还可以支持C风格的字符串流控制。
继承关系如下图:
类型 | 解释 |
---|---|
istrstream | C风格的串流的输入操作,字符串数组作为输入。 |
ostrstream | C风格的串流的输出操作,字符串数组作为输出。 |
strstream | 支持C风格的串流的输入输出操作。 |
文件处理简介
c++的文件处理也是看为一个对象,使用文件流的类,使用头文件,处理的时候有文本文件和二进制文件之分,主要的区别就是存储的形式。
C++ 通过以下几个类支持文件的输入输出:
- ofstream: 写操作(输出)的文件类 (由ostream引申而来)
- ifstream: 读操作(输入)的文件类(由istream引申而来)
- fstream: 可同时读写操作的文件类 (由iostream引申而来)
要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream>
和 <fstream>
。
文件处理基本流程:
文件的输入与输出
打开文件
在从文件读取信息或者向文件写入信息之前,必须先打开文件。
ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。
下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。
void open(const char *filename, ios::openmode mode);
open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。
可以把以上两种或两种以上的模式结合使用。例如,如果想要以写入模式打开文件,并希望截断文件,以防文件已存在,那么可以使用下面的语法:
ofstream outf;
outf.open("file.txt", ios::out | ios::trunc );
如果想要打开一个文件用于读写,可以使用下面的语法:
fstream file;
file.open("file.txt", ios::out | ios::in );
ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:
写入与读取
-
写入文件
在 C++ 编程中,可以使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里使用的是 ofstream 或 fstream 对象,而不是 cout 对象。
-
读取文件
在 C++ 编程中,可以使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里使用的是 ifstream 或 fstream 对象,而不是 cin 对象。
关闭文件
当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但写程序时应该养成一个好习惯,在程序终止前关闭所有打开的文件。
下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。
void close();
案例 - 写入
每次运行都会覆盖原来的内容:
#include <iostream>
#include <fstream> //1.头文件
using namespace std;int main()
{//2.创建流对象ofstream outf; //3.打开文件outf.open("file.txt"); //outf.open("file.txt",ios::out);//outf.open("file.txt",ios::app); //每次运行不会覆盖原来内容//4.写入内容outf << " 山村咏怀" << endl;outf << " 邵雍" << endl;outf << "一去二三里,烟村四五家。" << endl;outf << "亭台六七座,八九十枝花。" << endl;//5.关闭文件outf.close();return 0;
}
案例 - 读取
#include <iostream>
#include <fstream> //文件流的头文件
using namespace std;
int main()
{//char cf[100]; //字符数组string cf; //字符串ifstream infile;infile.open("file.txt",ios::in); //inf.open("file.txt");infile >> cf;infile.close();cout << cf;return 0;
}
在c++中使用ifstream读文件的时候会以空格为分隔符,遇到空格就不读取了。这时候可以调用get函数来读取内容。
#include <iostream>
#include <fstream> //文件流的头文件
using namespace std;
int main()
{char aifstream infile; //定义ifstream类(输入文件流类)对象infileinfile.open("file.txt"); //打开文件 使文件流与c++.txt文件建立关联while (!infile.eof()) {infile.get(a); //依次获取文件中每个字符 并输出 cout << a;}infile.close();return 0;
}
其实读取方式分为很多种,每种方式效率不同:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{ifstream ifs;ifs.open("file.txt", ios::in);//判断是否打开if (!ifs.is_open()){cout << "文件打开失败!" << endl;return 0;}//读数据//第一种:效率低,不建议使用/*char c;while ((c = ifs.get()) != EOF){cout << c;}*///第二种/*char buf[1024] = {0};while (ifs >> buf){cout << buf << endl;}*///第三种/*char buf[1024] = {0};while (ifs.getline(buf, sizeof(buf))){cout << buf << endl;}*///第四种string buf;while (getline(ifs,buf)) //getline函数需要#include <string>{cout<<buf<<endl;}ifs.close();return 0;
}
二进制文件读写
写文件
二进制写文件主要利用流对象调用成员函数 write()
函数原型:
ostream& write(const char*buffer,int len);
参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数
案例:
#include <iostream>
#include <fstream>
using namespace std;
class Student
{
public:Student() {}Student(string name,int age) :name(name), age(age) {}
protected:string name;int age;
};
int main()
{ofstream bof;Student s1("张三", 100);bof.open("student.txt", ios::out|ios::binary);bof.write((const char*) & s1, sizeof(Student));bof.close();return 0;
}
读文件
二进制读文件主要利用流对象调用成员函数 read()
函数原型:
istream& read( char*buffer,int len);
参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数
案例:
ifstream bif;
bif.open("student.txt", ios::in | ios::binary);
if (!bif.is_open())
{cout << "文件打开失败" << endl;return 0;
}
Student s2;
bif.read((char*)&s2, sizeof(Student));
cout << s2.name << " " << s2.age << endl;
bif.close();
fstream文件操作
ifstream支持>>操作,ofstream支持<<操作,fstream同时支持>>和<<操作。
打开文件 fstream可以在声明流对象时传入文件名打开文件,也可以使用open()函数打开文件。
关闭文件 文件打开后必须关闭,fstream提供close()函数关闭文件。
打开文件
使用构造函数声明对象时打开文件,示例:
fstream file(filename, ios::in | ios::out);
使用open()函数打开文件,函数原型:
void open(const char* filename,int mode,int access);
如果只传入文件名,系统会自动根据文件类型选择默认的打开模式。
打开文件模式mode如图:
模式和属性可以单独使用,也可以混合使用。混合使用时,用逻辑连接符或 |连接。
ios::out模式默认会清空,即ios::out|ios::trunc和ios::out打开文件时都会清空文件。
如果不想清空文件,那么设置读写模式为ios::out|ios::app,以这种模式打开文件后,数据会以追加的方式写入到文件。
读写文件
fstream提供的读写操作有:<<、>>、read()、write()、put()、get()、getline()。根据文件类型可分为文本文件和二进制文件,根据读写方式可分为逐行读写和整块读写。通常,文本文件使用逐行读写的方式,二进制文件使用整块读写的方式。
-
文本文件读写
逐行写入文本文件可以使用操作符====<<。
逐行读取文本文件时可以使用==getline()==函数。
-
二进制文件的读写
二进制文件通常整块读取或写入,当然也可以读写单个字符,用到的函数包括:put()、get()、read()、write()。
通常使用write()、put()函数写入二进制文件。使用read()、get()读取二进制文件。
案例
#include <iostream>
#include <fstream> //1.包含头文件
#include <string>
using namespace std;
int main()
{string str;fstream iofile; //2.创建对象iofile.open("file.txt",ios::out|ios::in|ios::trunc); //3.打开文件iofile << "这里是写入内容测试" << endl; //4.写入数据iofile << "this is test" << endl;iofile.close(); //5.关闭文件cout << "写入完毕" << endl;iofile.open("file.txt", ios::out | ios::in);while (getline(iofile,str)) //循环读取{cout << str << endl;}iofile.close();cout << "读取完毕" << endl;return 0;
}
文件定位和大小
C++的文件定位分为读位置和写位置的定位,对应的成员函数分别为seekg()和seekp()。seekg()函数设置读位置,seekp()设置写位置。函数原型如下:
istream& seekg(streamoff offset,seek_dir origin);
ofstream& seekp(streamoff offset,seek_dir origin);
offset表示偏移量,seek_dir表示移动的基准位置,取值如下:
取值 | 解释 |
---|---|
ios::beg | 文件开头 |
ios::cur | 文件当前位置 |
ios::end | 文件结尾 |
示例:
inFile.seekg(2,ios::beg); // 把文件读指针从开始位置向后移动2个字节
outFile.seekp(2,ios::cur); // 把文件写指针从当前位置向后移动2个字节
获取文件大小可以使用seekg()和tellg()或者seekp()和tellp()函数结合使用的方式获取文件大小。
示例:
inFile.seekg(0,ios::end); // 读文件指针移动到文件末尾
streampos ipos = inFile.tellg(); //返回当前指针的位置,也就是文件的大小,单位是字节
由此,我们可以对文件大小进行计算:
#include <iostream>
#include <fstream>
using namespace std;
int main(){ long start, end; ifstream ifile; ifile.open("test.txt", ios::in | ios::binary); start = ifile.tellg(); ifile.seekg(0, ios::end);end = ifile.tellg(); ifile.close(); cout << (end - start) << " bytes.\n"; //文件字节大小 return 0;
}
相关文章:

【C++知识点】文件操作
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...

VBA小模板,跨表统计的2种写法
目标 1 统计一个excel 文件里,多个sheet里的内容2 有的统计需求是,每个表只单表统计,只是进行批量操作3 有的需求是,多个表得某些行列累加等造出来得文件 2 实现方法1 (可能只适合VBAEXCEL,不太干净的写法…...

部署问题 | 百度LAC安装部署清单
本项目实现基于LAC提供RESTAPI服务的最小化方案。 依赖: python-3.9.9 百度lac2.X fastAPI uvicorn 首先下载并安装python,本人选择3.9版本。 依次安装: 安装 vc vc_redist.x64.exe 64位:https://download.microsoft.com/…...

提高办公效率的免费网站有哪些
收藏一些免费好用的网站,在我们工作中需要用到的时候可以直接使用,提高我们的工作效率。小编就和大家分享10个可以提高我们办公效率的免费网站。 1.羽兔网软件下载-以设计类软件为主的免费软件下载网站 很多小白都不知道怎么下载软件,往往搜…...

前端开发者需要掌握的具体内容和步骤
第一部分:前端开发实践 前端的工作职称 下面是一个前端开发者在职业发展中各种职称的描述列表. 对于前端开发者最普遍的职称是 "前端开发者" 或者 "前端工程师", 可以根据任何包含 "前端", "客户端", "web UI", "CS…...

杨校老师课堂之基于File类的文件管理器
在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。 本案例要求编写一个文件管理器,实现文件的批量操作。 文件管理器具体功能要求如下: 用…...

java面试算法汇总-数组
数组 [程序一] 两数之和 :给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,…...

Docker-Mysql主从复制
步骤 1、新建主服务器容器实例3307 docker run -d -p 3307:3306 --privileged=true -v /tmp/mysql_master/log:/var/log/mysql -v /tmp/mysql_master/data:/var/lib/mysql -v /tmp/mysql_master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql-master mys…...

(模拟)1241. 外卖店优先级
目录 题目链接 一些话 流程 套路 ac代码 题目链接 1241. 外卖店优先级 - AcWing题库 一些话 流程 // // 每经过 1 // 个时间单位,如果外卖店没有订单,则优先级会减少 1 // ,最低减到 0 // ;而如果外卖店有订单,则…...

Linux进程学习【进程地址】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

系统调用——文件操作相关函数
1.open open, creat - open and possibly create a file or device 打开一个文件,也可能创建一个文件,返回文件描述符 //头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //接口 int open(const char *pa…...

做互联网自媒体创业的月薪收入真的能过万吗?
搞自媒体创业有前途吗?收入月薪过万是真的吗? 自媒体创业是一种新兴的创业方法,它的远景十分广阔。自媒体创业能够让人们在自己的兴趣爱好和专业范畴上发挥自己的才能,一起也能够获得不错的收入。可是,月薪过万并不是…...

Kubernetes (k8s) 污点(Taint)、容忍介绍、示例
Kubernetes (k8s) 污点(Taint) 是一种机制,用于标记一个节点(Node)不可被调度的状态。它可以将一个污点标记添加到节点上,以防止 Pod 被调度到该节点上。污点可以用于实现各种策略,例如分离故障…...

多团队协作构建可观测性
实施 SRE 工程,守护系统的可靠性是一个⻓期的工作,需要开发、测试、运维以及 SRE 整个团队的努力。而可观测性平台天生就是为 SRE 工程服务的,它致力于实现 SLO 目标。建立可观测性不仅仅是运维团队的事情,更是整个开发、测试以及…...

100种思维模型之认知资源思维模型-030
我们常说,一个人永远也赚不到自己认知以外的钱,这话的确很有道理,被无数人所推崇。 由此,不难看出,认知在我们的生活起着多么关键的作用。 你的认知层次越高,范围越广,就意味着你这个人所处的阶…...

c/cpp - 多线程/进程 基础
c/cpp - 多线程/进程 基础1. 概念1.1 程序1.2 任务1.3 多任务1.4 进程1.5 线程1.5 线程/进程应用程序/系统资源并发/并行/同步/异步1. 概念 1.1 程序 代码、指令,静态的 1.2 任务 具体要做的实景,可以是基于进程、或基于线程 1.3 多任务 例如࿱…...

第55章 头像图片的前端渲染显示
1 WebApi.Controllers.CustomerController.GetCustomerByToken /// <param name"token">1个指定的令牌字符串。</param> /// <summary> /// 【通过令牌获取用户-无需权限】 /// </summary> /// <remarks> /// 摘要: /// …...

vue2 使用 cesium 【第二篇-相机视角移动+添加模型】
vue2 使用 cesium 【第二篇-相机视角移动添加模型】 搞了一阵子 cesium,小白入门,这东西很牛逼,但是感觉这东西好费劲啊!网上资料不多,每个人的用法又不一样,操作起来真的是绝绝子。之前写了一篇 vue2 使用…...

C/C++ 操作ini文件(SinpleIni 跨平台库)
最近在学习时,发现自己还不会操作ini文件,想着以前工作时接触到的项目或多或少都要用到ini文件去保存初始化程序的数据;所以赶紧去网上搜索以下C/C操作ini文件都有些什么库可以玩玩;搜索到有: 1. inih:这是…...

Cadence Allegro 导出Design Rules Check(DRC)Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Design Rules Check(DRC)Report作用3,Design Rules Check(DRC)Report示例4,Design Rules Check(DRC)Report导出方法4.1,方法14.2,方法2B站关注“硬小...

Java的stream流
Java 8中引入的新特性,stream流通过与Lambda表达式结合,采用函数式编程,简化数组、集合操作,提高效率。 我们操作一个集合,就把他看作一个流,整个流依次执行,(可以类比为一个管道&a…...

Mybatis_相关配置解析和ResultMap
目录配置解析核心配置文件mybatis-config.xml 系统核心配置文件environments元素子元素节点:environmentmappers元素Mapper文件Properties优化typeAliases优化その他生命周期和作用域(Scope)方法作用域应用作用域方法作用域ResultMap提出问题…...

Python量化入门:利用中长期RSI寻找趋势拐点,抓大放小,蹲一个大机会!
一、RSI的原理 1. RSI简介 股票的涨跌说白了就是多空博弈造成的,多方力量更强则股票价格上涨,空方力量更强则股票价格下跌。那么我们如何来衡量股票的多空力量强弱呢? 上个世纪70年代,威尔斯威尔得发表了相对强弱指标,即我们常说的RSI(Relative Strength Index),RSI…...

案例14-代码结构逻辑混乱,页面设计不美观
目录 目录 一:背景介绍 二:思路&方案 三:过程 问题1:代码可读性差,代码结构混乱 问题2: 代码逻辑混乱,缺乏封装的意识 问题3:美观问题:问题和图标没有对应上 四…...

弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记
弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记一、Abstract二、引言三、相关工作A、全监督参考图像分割B、基于 Box 的实例分割C、带有噪声标签的学习四、提出的方法A、概述B、伪标签生成目标轮廓预测Proposal 选…...

Linux进程和任务管理和分析和排查系统故障
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...

【满分】【华为OD机试真题2023 JAVA】最多几个直角三角形
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 最多几个直角三角形 知识点递归深搜 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 有N条线段,长度分别为a[1]-a[N]。现要求你计算这N条线段最多可以组合成几个直角三角形,每条线段只能使用一次,每个三…...

PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局
目录 一、数据库建表 1 建表 2 插入数据 3 查看表数据 二、建立项目 1 新建项目 2 appMain.py 3 myMainWindow.py 4 myChartView.py 2.4.1 提升的后果 2.4.2 QmyChartView类说明 2.4.3 添加代码 三、修改myMainWindow.py程序,添加功能 1 打开数据库 …...

sonarqube指标详解
最近公司引入了sonar,作为代码质量检测工具,以期提高研发同学的代码质量,但是结果出来后,有些同学不清楚相应的指标内容,不知道应该重点关注哪些指标,于是查询了一下相关的资料,加以总结同时也分…...

耳机 喇叭接线分析
1 注意 1 首先必须接地 2 接某一个声道 2 分析 从三段式耳机结构可以得出: 模拟数据 必须的 结构 1 地 2 左or右信号 附加 我们要注意 耳机也是分左声道 右声道的 参考:耳机插头3.5与2.5三段与四段i版与n版等详解 在iPhone还没现在这么NB的时候&a…...