C++ 文件操作

目录

  • C++文件操作
    • 1. 使用系统函数读写
      • linux平台
        • 判断是否存在
        • 创建文件 create()接口
        • 打开文件 open()接口
        • 读取文件 read()接口
        • 写文件 write()接口
        • 关闭文件 close()接口
        • 调整读写文件的位置(偏移量)lseek()接口
        • 获取文件基本信息
        • 操作文件状态 fcntl函数
      • windows平台
        • 打开文件
        • 读取文件
        • 关闭文件
        • 判断文件是否存在
        • 获取文件基本信息
    • 2. 使用C++ fstream库
      • 2.1 文件对象的定义
      • 2.2 打开文件
      • 2.3 读写文件
        • 2.3.1 以流的方式读写
        • 2.3.2 以成员函数的方式读写
      • 2.4 指针移动
      • 2.5 关闭文件
    • 3. 使用C语言库函数

C++文件操作

参考:全网最详细C/C++文件读写总结

1. 使用系统函数读写

linux平台

判断是否存在

头文件:unistd.h
接口:int access(const char* __path, int __mode);
如果文件存在返回值为0,否则返回值不为0。接口调用过程中,会将错误码保存在全局变量errno中,接口调用结束可通过判断errno的值,来进一步判断文件是确实不存在,还是由于权限限制访问文件失败。

uint32_t BasicFileSystem::FileExists(std::string_view path)
{if (access(path.data(), F_OK) != 0) {if (errno != ENOENT) {LOG_ERROR("BasicFileSystem-{}: fail to access, error({})", __func__, errno);}return errno;}return 0;
}
创建文件 create()接口

头文件:fcntl.h
接口:int creat(const char* __path, mode_t __mode);
创建成功时,返回新创建文件的fd;失败时,返回-1,并设置全局变量errno。

打开文件 open()接口

头文件:fcntl.h
接口:int open(const char* const __pass_object_size pathname, int flags, mode_t modes)
返回值:文件描述符 fd

参数1:文件绝对路径;
参数2 flags:指定文件打开方式,包括只读O_RDONLY | O_WRONLY只写 | O_RDWR读写 | O_CREAT不存在时自动创建 | O_TRUNC | O_APPEND追加等;
参数3 mode:文件的权限信息,只有flags为O_CREAT创建新文件时才会使用参数mode;

#include <fcntl.h>std::string_view path;
int fd = open(path.data(), flags, mode); // fd < 0 说明打开文件失败
读取文件 read()接口

头文件:unistd.h
接口:
ssize_t read(int __fd, void* __buf, size_t __count);
ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset);
返回值:读取的字节数,返回值<0,说明读取失败,错误码将保存在全局变量errno中。

参数1:文件描述符;
参数2:保存读取结果的缓冲区;
参数3:想要读取的字节数;
参数4:开始读取的位置(偏移量);

写文件 write()接口

头文件:unistd.h
接口:
ssize_t write(int __fd, const void* __buf, size_t __count);
ssize_t pwrite(int __fd, const void* __buf, size_t __count, off_t __offset);
参数buf 所指的内容写入count 个字节到参数fd 所指的文件内。
返回值:写入的字节数,返回值<0,说明写入失败,错误码将保存在全局变量errno中。

思考:利用read、write每次读或写1个Byte与利用gets和puts每次读或写1个Byte哪一种方式速度更快?
read和write函数的使用

关闭文件 close()接口

头文件:unistd.h
接口声明:int close(int __fd);
返回值:关闭成功返回0,否则关闭失败。

调整读写文件的位置(偏移量)lseek()接口

头文件:unistd.h
接口:off_t lseek(int __fd, off_t __offset, int __whence);
将fd所表示的文件的读写位置,移动到offset设置的位置,起始偏移位置由whence决定。
whence有如下三种:

/** Seek to an absolute offset. */
#define SEEK_SET 0
/** Seek relative to the current offset. */
#define SEEK_CUR 1
/** Seek relative to the end of the file. */
#define SEEK_END 2
获取文件基本信息

使用stat指令获取文件基本信息:
Linux命令:stat
Linux基础命令-stat显示文件的状态信息

代码中使用stat接口获取文件基本信息:Linux:st_mode详细分析
stat接口头文件:#include <sys/stat.h>
接口:
int stat(const char* __path, struct stat* __buf);
int fstat(int __fd, struct stat* __buf);
成功时,返回值为0,结果保存在stat结构体中;失败时,返回值不为0,错误码将保存在全局变量errno中。

使用mode值获得文件类型和权限信息,调用S_ISREG(mode)宏接口:#include<linux/stat.h>

操作文件状态 fcntl函数

int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
注:F_GETFL表示获取文件状态
F_SETFL表示设置文件状态

windows平台

打开文件
读取文件
关闭文件
判断文件是否存在

_access_s,_waccess_s

获取文件基本信息

2. 使用C++ fstream库

2.1 文件对象的定义

fstream提供三种类,实现C++对文件的操作:

ofstream:写操作,由ostream引申而来
ifstream:读操作,由istream引申而来
fstream :同时读写操作,他是前两者的父类,由iostream引申而来

创建一个文件对象:

fstream file;

2.2 打开文件

文件的打开类型:

ios::in 为输入(读)而打开文件;
ios::out 为输出(写)而打开文件;
ios::ate 初始位置:文件尾;
ios::app 所有输出附加在文件末尾;
ios::trunc 如果文件已存在则先删除该文件;
ios::binary 二进制方式;
ios::nocreate:不建立文件,所以文件不存在时打开失败;
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败;

例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:

方法一:
ofstream file;
file.open ("example.bin", ios::out | ios::app | ios::binary);方法二:
ofstream file ("example.bin", ios::out | ios::app | ios::binary);

通过调用成员函数is_open()来检查一个文件是否已经被顺利的打开了:

接口:bool is_open();
!file.is_open() || !file 两种方式任选其一即可。

2.3 读写文件

2.3.1 以流的方式读写

读文件:使用 >>
写文件:使用 <<

#include <iostream>
#include <fstream>
#include <string>using namespace std;int main()
{fstream file;file.open("2.txt", ios::out | ios::in);if (!file || !file.is_open()){cout << "打开失败" << endl;return;}const char* str2 = "HelloWorld";file << str2 << " " << 4; // 写文件file.seekg(0, ios::beg); // 将读写指针移动到起始int num = 0;	char str[20] = " ";     file >> str >> num; // 读文件,每一个>>符号每次只能读出由空格、回车等白色字符分开的一块内容cout << str << num << endl;int n = file.tellg();  // 文件指针位置cout << n << endl;file.close(); // 关闭文件return 0;
}
2.3.2 以成员函数的方式读写

读文件:
// 至多读取n字节的内容到缓存s中
file.read(char_type* __s, streamsize __n);

// 按行读取
// 作用是从istream中读取至多n个字符保存在s对应的数组中。
// 即使还没读够n个字符,如果遇到换行符’\n’则读取终止。
// 读取过程中,相比>>符号的读取方式,会将白色字符也一并读取出来。
file.getline(char_type* __s, streamsize __n);

// 按元素读取
// 挨个元素读取,空白字符包括换行符将被视为字符的一种,也会被读取出来。
char c = file.get();
file.get(char_type& __c);
// 至多读取n个元素,空白字符包括换行符将被视为字符的一种,也会被读取出来。
file.get(char_type* __s, streamsize __n);

写文件:
file.write(,大小)

2.4 指针移动

文件指针位置的用法:

ios::beg 文件头
ios::end 文件尾
ios::cur 当前位置
例子:
file.seekg(0,ios::beg); //让文件指针定位到文件开头
file.seekg(0,ios::end); //让文件指针定位到文件末尾
file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节
file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节
file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置文件指针的获取:
int pos = tellg();  // 相比ios::beg的字节数

2.5 关闭文件

file.close();

c++文件读写(很全)

3. 使用C语言库函数

打开文件:FILE *fopen(const char filename, const char mode);
写文件:size_t fwrite(const void
buffer, size_t size, size_t count, FILE
fd);
读文件:size_t fread(void *buffer, size_t size, size_t count, FILE *fd);
关闭文件:close(fd);

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

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

相关文章

PostgreSQL索引篇 | GiST索引

GiST索引 PostgreSQL版本为8.4.1 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; GiST&#xff08;Generalized Search Tree&#xff0c;通用搜索树&#xff09;是一种平衡的、树状结构的访问方法。 它在系统中…

java复健01——jdk17、maven3.5、vscode的安装

遇到的问题以及解决方案 Q1. 用choco安装jdk17、jdk20均失败&#xff0c;报一些奇奇怪怪的错 A1&#xff1a; 最稳妥的方法&#xff1a;用管理员权限运行cmd或者shell&#xff0c;用choco search jdk命令看一下有什么版本的jdk&#xff0c;如果列表里没有&#xff0c;应该是…

【数学建模】传染病模型笔记

传染病的基本数学模型&#xff0c;研究传染病的传播速度、空间范围、传播途径、动力学机理等问题&#xff0c;以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等&#xff0c;按照传播机理又分为基于常微分方程、偏微分方程、网…

代购系统小程序商城APP快速上货采集商品API接口

搜索采集商品使用item_search获取商品id列表&#xff0c;全店商品采集使用item_search_shop获取整店商品id列表&#xff0c;支持翻页显示。获取到的商品id列表再传入获取商品详情接口item_get来获取商品详情页的详情信息。 item_search-按关键字搜索淘宝商品 item_search_sho…

Redis特性与应用场景

Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;用于作为数据缓存&#xff0c;在分布式系统中能够发挥重要作用。 Redis的特性 1.In-memory data structures: MySQL使用表的方式存储数据&#xff0c;这意味着数据通常存储在硬盘上&#xff0c;并且…

python 网络库集锦

目录 通用网络库 网络爬虫框架 1.功能齐全的爬虫 2.其他 HTML/XML解析器 1.通用 2.清理 文本处理 自然语言处理 浏览器自动化与仿真 多重处理 异步网络编程库 队列 云计算 网页内容提取 WebSocket DNS解析 计算机视觉 通用网络库 1.urllib -网络库(stdlib)。…

Unity自带的WebSocket使用说明

Unity中的WebSocket是一种用于实时性强、低延迟的双向通信的技术。它可以在客户端和服务器之间建立一个持久的连接&#xff0c;允许双方随时互相发送数据。这种实时性使得WebSocket在游戏中非常有用&#xff0c;特别是对于多人在线游戏和实时竞技游戏。 在Unity中&#xff0c;…

如何在vue中使用sort对数组进行排序

vue.js 是一款流行的前端框架&#xff0c;它提供了很多便捷的方法和指令来处理数据。其中一个常见的需求是对数组进行排序操作&#xff0c;Vue.js的sort方法就能很好地满足这个需求。以下介绍如何使用vue.js的sort方法来对数组进行排序。 首先&#xff0c;我们需要创建一个Vue…

使用registry镜像创建私有仓库

通过安装Docker后&#xff0c;Docker官网提供的registry镜像简单搭建一套本地私有仓库 1.通过registry镜像 &#xff0c;做端口映射&#xff0c;创建一个容器&#xff0c;通过容器内的一个目录来创建私有仓库 并且将容器内仓库与本地路径做挂载 [rootnode1 ~]# docker run -d…

【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱

1 基本定义 一维信号NLM非局部均值滤波算法是一种基于非局部均值思想的滤波方法&#xff0c;它通过对信号进行分块&#xff0c;计算每个块与其他块之间的相似度&#xff0c;以非局部均值的方式去除噪声。该算法的主要思想是在一定范围内寻找与当前块相似的块&#xff0c;以这些…

分享一些实用性的大语言模型(GitHub篇)

1.多模态大模型 GitHub网址&#xff1a;haotian-liu/LLaVA&#xff1a;[NeurIPS23 Oral] 视觉指令调优 &#xff08;LLaVA&#xff09; 构建&#xff0c;旨在实现 GPT-4V 级别及以上的能力。 (github.com) 下面是LLaVA模型的介绍&#xff0c;作者都有一直维护和更新&#xff0c…

【leetcode热题】排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#xff1a; 输入…

操作系统:环境变量

目录 1.命令行参数 1.1.概念引入 1.2.命令行参数概念 2.环境变量 2.1.概念引入 2.2.环境变量概念 2.2.1常见的环境变量 2.3. 如何获取环境变量 2.3.1.Linux操作系统 2.3.2.代码获取 2.3.3.系统调用 2.4.环境变量的来源 2.5.环境变量的全局性 1.命令行参数 1.1.概念…

git pull 跟 git pull origin master的区别

git pull 和 git pull origin master 之间的主要区别在于它们处理远程分支和本地分支的方式。 git pull 命令默认从当前配置的远程仓库&#xff08;通常是 origin&#xff09;中拉取并合并当前分支的更新。这意味着&#xff0c;如果你已经在本地签出了某个分支&#xff08;比如…

uniapp开发的跳转到小程序

uniapp开发的h5跳转到小程序 https://www.cnblogs.com/xiaojianwei/p/16352698.html uniapp拉起小程序 在uniapp中拉起小程序&#xff0c;可以使用官方提供的API uni.navigateToMiniProgram。以下是一个简单的示例代码&#xff1a; uni.navigateToMiniProgram({appId: 目标…

unity学习(54)——选择角色界面--解析赋值服务器返回的信息1

1.decode这种照猫画虎的工作 把逆向出来UserHandler.cs中的内容&#xff0c;融到自建客户端的MessageManager.cs中&#xff1a; 2.此时登录账号&#xff0c;马上显示当前账号下已有三名角色&#xff1a; 此时返回数据包中的command的值是1&#xff1a; 3.当注册玩家数超过三名…

【大厂AI课学习笔记NO.78】智能芯片产业人才能力图谱

有志于从事智能芯片产业的朋友&#xff0c;可以参考下上面的图谱。 比如C站的程序猿很多&#xff0c;那么技能能力中&#xff0c;你要掌握的就包括C/C、Python、Bash等常用的编程语言。 还要熟悉TensorFlow、PyTorch等主流的深度学习框架。 这两个框架&#xff0c;我们都介绍…

【MySQL】MySQL内外连接

文章目录 一、表的内连接二、表的外连接1.左外连接2.右外连接 一、表的内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a; select 字段 f…

kafka或者rokectMq消费堆积,如何排查并解决?

kafka和rocketMq都是消息中间件&#xff0c;消息中间件的作用&#xff0c;异步&#xff0c;削峰&#xff0c;解耦。 异步化提升性能。通过引入消息中间件&#xff0c;可以在客户端和服务器之间实现异步通信&#xff0c;从而提高系统的处理能力和响应速度。1降低耦合度。消息中…

突破编程_C++_设计模式(装饰器模式)

1 装饰器模式的基本概念 在 C 中&#xff0c;装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰器模式相比生成子类更为灵活&#xff0c;它可以在不…