C语言标准I/O与Linux系统调用的文件操作
01. 标准库函数与系统调用对比
系统调用 | 标准I/O库 |
---|---|
open/read/write/close | fopen/fread/fwrite/fclose |
文件描述符(fd) | 文件指针(FILE*) |
无缓冲,直接系统调用 | 自动缓冲管理 |
每次操作触发系统调用 | 减少系统调用次数 |
<fcntl.h> <unistd.h> | <stdio.h> |
系统调用封装层:
标准库函数在保证功能的前提下能够提升性能,扩展专属功能。
fopen与fread设计系统调用示例:
数据交换方式:
读写操作异同
系统调用族:
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
//文件定位
off_t lseek(int fd, off_t offset, int whence);
标准库函数:
//文件读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
//文件查找
int fseek(FILE *stream, long offset, int whence);
long int ftell(FILE *stream);
void rewind(FILE *stream);
02. 系统调用文件操作
2.1 文件打开open()
系统调用 open()
向文件描述符fd
写入数据。
int open(const char *pathname, int flags, mode_t mode);
- 参数说明:
flags
:必选其一:O_RDONLY
,O_WRONLY
,O_RDWR
- 可选标志(一个
/
多个):O_CREAT
(创建),O_APPEND
(追加),O_TRUNC
(清空)等 mode
:文件权限umask
(八进制数,如0666)
2.2 文件关闭close()
int close(int fd);
2.3 文件写入write()
从用户空间buf
读取count
个字节数据写到fd
指向的文件中。
ssize_t write(int fd, const void *buf, size_t count);
- 参数:
fd
:文件描述符buf
:被写入的数据缓冲区count
:要写入的字节数
- 返回值:成功返回写入的字节数,失败返回-1
2.4 文件读取read()
从文件描述符fd
指向的文件中读取count
字节数据放到buf
缓冲区内。
ssize_t read(int fd, const void *buf, size_t count);
- 参数:
fd
:文件描述符buf
:读出的数据存放位置count
:要写入的字节数
- 返回值:成功返回写入的字节数,失败返回-1
ssize_t
指有一个-1
错误码表示失败的情况。
2.5 文件定位lseek()
off_t lseek(int fd, off_t offset, int whence);
- whence参数:
- SEEK_SET:文件开头
- SEEK_CUR:当前位置
- SEEK_END:文件结尾
返回值:成功: 返回新的offset
。失败:返回(off_t)-1
啊
文件操作基础流程: 打开文件 → 读写操作 → 关闭文件
03.C文件的打开与关闭
3.2 二进制文件语文本文件
如数字63,在文本文件中表示6和3两个ASCII字符表示
'6' → 0x36
'3' → 0x33
文件内容:36 33//与字符编码一致
而在二进制文件中将63直接转化成二进制形式
//在32位下,int类型,
//小端对齐(字节内部顺序不变,储存顺序与阅读顺序相反即:00 00 00 3F是我们转换的二进制内容)
//需考虑字节序/对齐
3F 00 00 00 // 63的十六进制是0x3F
3.2 文件的打开fopen()
//文件打开
FILE *fopen(const char *filename, const char *mode);
- 功能:打开文件并返回文件指针
- 参数:
pathname
:文件路径mode
:打开模式(“r”, “w”, “a”, “r+”, “w+”, "a+"等)
- 返回值:成功返回FILE指针,失败返回NULL
打开模式: 输出->到磁盘
模式字符串 | 含义 | 如果指定文件不存在 |
---|---|---|
“r” | 只读 - 打开文本文件输入数据 | 出错 |
“w” | 只写 - 创建文本文件输出数据 | 建立新文件 |
“a” | 追加 - 向文本文件尾添加数据 | 建立新文件 |
“rb” | 只读 - 打开二进制文件输入数据 | 出错 |
“wb” | 只写 - 创建二进制文件输出数据 | 建立新文件 |
“ab” | 追加 - 向二进制文件尾添加数据 | 建立新文件 |
“r+” | 读写 - 打开文本文件进行读写 | 出错 |
“w+” | 读写 - 创建新文本文件进行读写 | 建立新文件 |
“a+” | 读写 - 打开文本文件在文件尾读写 | 建立新文件 |
“rb+” | 读写 - 打开二进制文件进行读写 | 出错 |
“wb+” | 读写 - 创建新二进制文件进行读写 | 建立新文件 |
“ab+” | 读写 - 打开二进制文件在文件尾读写 | 建立新文件 |
注意:
w
系列模式("w"
,"w+"
,"wb"
,"wb+"
):强制清空。a
系列模式("a"
,"a+"
,"ab"
,"ab+"
):追加写入。r
系列模式("r"
,"r+"
,"rb"
,"rb+"
):保留内容(文件必须存在)
示例:fopen("log.txt", "r")
3.3 文件的关闭fclose()
int fclose(FILE *stream);
- 成功返回
0
,失败返回EOF
- 必须调用以避免资源泄漏
04. 文件顺序读写
4.1字符读写
int fgetc(FILE *stream); // 读取一个字符
int fputc(int c, FILE *stream); // 写入一个字符到流中
4.2字符串读写
int fputs(const char *str, FILE *stream); // 写入字符串到流中
特性:
- 函数在遇到第一个
\0
时就停止
char *fgets(char *str, int n, FILE *stream); // 读取n-1字符到str中,最后一个位置自动补`\0`
fgets
读取到换行符或n-1
个字符后停止- 自动添加
\0
终止符
4.3 格式化读写
int fprintf(FILE *stream, const char *format, ...); // 格式化写入到磁盘
将可变参数中的数据,按照编写的format
格式写入到strem
流(先缓存再刷新到磁盘)中。
stream
:目标文件(如stdout
、stderr
或FILE*
文件指针)format
:格式化字符串(类似printf
)...
:可变参数- 返回值:成功时返回写入的字符数,失败返回负值。
+--------------------------+ 格式化转换 +-------------------+ 写入文件
| 变量 (age, score,add) | ------------> | 格式化后的字符串 | ------------> log.txt
+--------------------------+ +-------------------+
int fscanf(FILE *stream, const char *format, ...); // 格式化读取内存
从strem
(文件流)中按照format
的格式匹配数据,转换数据并存储到变量当中。
stream
:源文件(如stdin
或FILE*
文件指针)format
:格式化字符串(指定如何解析数据)...
:可变参数(存储读取的数据)- 返回值:成功匹配的参数个数,失败或
EOF
时返回EOF(-1)
+-------------------+ 解析 & 转换 +---------------------+
| 文件内容 (字符串) | ------------> | 变量 (age, score,add)|
+-------------------+ +---------------------+
//将格式化数据写入字符串str
int sprintf(char *str, const char *format, ...);
//从字符串str中读取格式化输入 变量...
int sscanf(const char *str, const char *format, ...);
4.4 二进制读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数说明:
ptr
:指向要读写的数据的指针size
:单个元素字节数nmemb
:读写元素数量stream
: 文件指针
返回值:成功读写的元素个数
二进制写/读:stus
是一个结构体数组可做首地址类似于数组名。
05. 文件随机读写
5.1 fseek()
功能:根据文件指针位置和偏移量来定位文件指针,跳转到指定位置
int fseek(FILE *stream, long offset, int origin);
- 参数:
stream
:文件指针。offset
:偏移量(字节数)。origin
:基准位置,可选值:SEEK_SET
:文件开头。SEEK_CUR
:当前位置。SEEK_END
:文件末尾。
5.2 ftell()
功能:返回当前文件指针相对于起始位置偏移量
long ftell(FILE *stream);
5.3 rewind()
功能:让文件指针回到文件起始位置
void rewind(FILE *stream);
相关文章:

C语言标准I/O与Linux系统调用的文件操作
01. 标准库函数与系统调用对比 系统调用标准I/O库open/read/write/closefopen/fread/fwrite/fclose文件描述符(fd)文件指针(FILE*)无缓冲,直接系统调用自动缓冲管理每次操作触发系统调用减少系统调用次数<fcntl.h> <unistd.h><stdio.h> 系统调用…...

【MYSQL】笔记
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 在ubuntu中,改配置文件: sudo nano /etc/mysql/mysql.conf.d/mysq…...

线程池核心线程永续机制:从源码到实战的深度解析
简介 源管理的基石,其核心线程为何不会超时销毁一直是开发者关注的焦点。核心线程的永续机制不仅确保了系统的稳定响应,还避免了频繁创建和销毁线程带来的性能损耗。本文将从源码层面深入剖析线程池核心线程的存活原理,同时结合企业级实战案例,展示如何正确配置和管理线程…...

DS新论文解读(2)
上一章忘了说论文名字了,是上图这个名字 我们继续,上一章阅读地址: dsv3新论文解读(1) 这论文剩下部分值得说的我觉得主要就是他们Infra通信的设计 先看一个图 这个是一个标准的h800 8卡with 8cx7 nic的图…...

html文件cdn一键下载并替换
业务场景: AI生成的html文件,通常会使用多个cdn资源、手动替换or下载太过麻烦、如下py程序为此而生,指定html目录自动下载并替换~ import os import requests from bs4 import BeautifulSoup from urllib.parse import urlparse import has…...
react路由中Suspense的介绍
好的,我们来详细解释一下这个 AppRouter 组件的代码。 这个组件是一个在现代 React 应用中非常常见的模式,特别是在使用 React Router v6 进行路由管理和结合代码分割(Code Splitting)来优化性能时。 JavaScript const AppRout…...

【ROS2】 核心概念6——通信接口语法(Interfaces)
古月21讲/2.6_通信接口 官方文档:Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战:https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Single-Package-Define-And-Use-Interface.html ROS 2使用简化的描…...

matlab官方免费下载安装超详细教程2025最新matlab安装教程(MATLAB R2024b)
文章目录 准备工作MATLAB R2024b 安装包获取详细安装步骤1. 文件准备2. 启动安装程序3. 配置安装选项4. 选择许可证文件5. 设置安装位置6. 选择组件7. 开始安装8. 完成辅助设置 常见问题解决启动失败问题 结语 准备工作 本教程将帮助你快速掌握MATLAB R2024b的安装技巧&#x…...

【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案
WPF手机号码归属地批量查询与分类导出方案 应用场景 市场营销:企业根据手机号码归属地进行精准营销,按城市或省份分类制定针对性推广策略客户管理:快速对客户手机号码进行归属地分类,便于后续客户关系管理数…...

ctf 基础
一、软件安装和基本的网站: 网安招聘网站 xss跨站脚本攻击 逆向:可以理解为游戏里的外挂 pwn最难的题目 密码学: 1、编码:base64 2、加密:凯撒 3、摘要:MD5、SHA1、SHA2 调查取证:杂项&am…...
掌握HTML文件上传:从基础到高级技巧
HTML中input标签的上传文件功能详解 一、基础概念 1. 文件上传的基本原理 在Web开发中,文件上传是指将本地计算机中的文件(如图片、文档、视频等)传输到服务器的过程。HTML中的<input type"file">标签是实现这一功能的基础…...
UE5无法编译问题解决
1. vs编译 2. 删除三个文件夹 参考...

CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
一、环境 二、命令及含义 fdisk fdisk是一个较老的分区表创建和管理工具,主要支持MBR(Master Boot Record)格式的分区表。MBR分区表支持的硬盘单个分区最大容量为2TB,最多可以有4个主分区。fdisk通过命令行界面进行操…...
机器学习07-归一化与标准化
归一化与标准化 一、基本概念 归一化(Normalization) 定义:将数据缩放到一个固定的区间,通常是[0,1]或[-1,1],以消除不同特征之间的量纲影响和数值范围差异。公式:对于数据 ( x ),归一化后的值…...

AI agent与lang chain的学习笔记 (1)
文章目录 智能体的4大要素一些上手的例子与思考。创建简单的AI agent.从本地读取文件,然后让AI智能体总结。 也可以自己定义一些工具 来完成一些特定的任务。我们可以使用智能体总结一个视频。用户可以随意问关于视频的问题。 智能体的4大要素 AI 智能体有以下几个…...
优化 Spring Boot 应用启动性能的实践指南
1. 引言 Spring Boot 以其“开箱即用”的特性深受开发者喜爱,但随着项目复杂度的增加,应用的启动时间也可能会变得较长。对于云原生、Serverless 等场景而言,快速启动是一个非常关键的指标。 2. 分析启动过程 2.1 启动阶段概述 Spring Boot 的启动流程主要包括以下几个阶…...

谢赛宁团队提出 BLIP3-o:融合自回归与扩散模型的统一多模态架构,开创CLIP特征驱动的图像理解与生成新范式
BLIP3-o 是一个统一的多模态模型,它将自回归模型的推理和指令遵循优势与扩散模型的生成能力相结合。与之前扩散 VAE 特征或原始像素的研究不同,BLIP3-o 扩散了语义丰富的CLIP 图像特征,从而为图像理解和生成构建了强大而高效的架构。 此外还…...

【idea】调试篇 idea调试技巧合集
前言:之前博主写过一篇idea技巧合集的文章,由于技巧过于多了,文章很庞大,所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的,用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

二叉树深搜:在算法森林中寻找路径
专栏:算法的魔法世界 个人主页:手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …...
golang 安装gin包、创建路由基本总结
文章目录 一、安装gin包和热加载包二、路由简单场景总结 一、安装gin包和热加载包 首先终端新建一个main.go然后go mod init ‘项目名称’执行以下命令 安装gin包 go get -u github.com/gin-gonic/gin终端安装热加载包 go get github.com/pilu/fresh终端输入fresh 运行 &…...

BMVC2023 | 多样化高层特征以提升对抗迁移性
Diversifying the High-level Features for better Adversarial Transferability 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology实验-Experiments结论-Conclusion 论文链接 GitHub链接 本文 “Diversifying the High-level Features for better Adve…...

有哪些GIF图片转换的开源工具
以下是关于GIF图片转换的开源工具的详细总结,涵盖功能特点、适用场景及用户评价: 1. FFmpeg 功能特点: 作为开源命令行工具,FFmpeg支持视频转GIF、调整帧率、分辨率、截取片段等操作,可通过脚本批量处理。适用场景: 适合开发者或技术用户进行高效批处理,常用于服务器端自…...

C++—特殊类设计设计模式
目录 C—特殊类设计&设计模式1.设计模式2.特殊类设计2.1设计一个无法被拷贝的类2.2设计一个只能在堆上创建对象的类2.3设计一个只能在栈上创建对象的类2.4设计一个类,无法被继承2.5设计一个类。这个类只能创建一个对象【单例模式】2.5.1懒汉模式实现2.5.2饿汉模…...

Android 手写签名功能详解:从原理到实践
Android 手写签名功能详解 1. 引言2. 手写签名核心实现:SignatureView 类3. 交互层实现:MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中,手写签名功能已成为提升用户体验与业务合规性的关…...

Level2.8蛇与海龟(游戏)
#小龟快跑游戏 输入难度(1-5),蛇追到龟,游戏结束 #分析问题:从局部>整体 #游戏画面:创建画笔(海龟蛇)>1.海龟移动(键盘控制)>2.蛇(自动追踪,海龟位置)>3.海龟(限定范围,防止跑出画布之外)>4.游戏&…...

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块
背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期,在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后,要想在Android.bp中通过自定义的一个变量或者条件实现选…...

【Canvas与诗词】醉里挑灯看剑 梦回吹角连营
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>醉里挑灯看剑梦回吹角连营 Draft1</title><style type"…...
Hue面试内容整理-Hue 架构与前后端通信
Cloudera Hue 是一个基于 Web 的 SQL 助手,旨在为数据分析师和工程师提供统一的界面,以便与 Hadoop 生态系统中的各个组件(如 Hive、Impala、HDFS 等)进行交互。其架构设计强调前后端的分离与高效通信,确保系统的可扩展性和可维护性。以下是 Hue 架构及其前后端通信机制的…...
Linux搜索
假如我们要搜索 struct sockaddr_in 我们在命令终端输入 cd/usr/include/ //进入头文件目录地址 /usr/include/ grep " struct sockaddr_in { " *-nir (*是在当前目录,n 是找出来显示行数…...
Git基础原理和使用
Git 初识 一、版本管理痛点 在日常工作和学习中,我们经常遇到以下问题: - 通过不断复制文件来保存历史版本(如报告-v1、报告-最终版等) - 版本数量增多后无法清晰记住每个版本的修改内容 - 项目代码管理存在同样问题 二、版本控…...