C语言标准I/O与Linux系统调用的文件操作

news2025/5/19 14:53:48

01. 标准库函数与系统调用对比

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

系统调用封装层:
标准库函数在保证功能的前提下能够提升性能,扩展专属功能。

标准库
open
fopen
fread
read

fopen与fread设计系统调用示例:

App Stdio Kernel fopen("data.txt", "r") open("data.txt", O_RDONLY) 返回fd=3 创建FILE结构体(含fd=3) 返回FILE* fread(buffer, 1, 100, fp) read(fd=3, buffer, 100) 返回读取字节数 返回结果 fclose(fp) close(fd=3) App Stdio Kernel

数据交换方式:

内核空间
用户空间
标准库函数
系统调用
缓冲区满/flush
立即进入
内核页缓存
磁盘控制器
标准库缓冲区
应用程序
用户直接缓冲区
物理磁盘

读写操作异同

系统调用族:

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")

用户 stdlio 内核 fopen("log.txt", "r") 调用open("log.txt", O_RDONLY) 返回fd=3(后面Linux中补充) malloc(sizeof(FILE)) 初始化FILE结构体 返回FILE*指针 用户 stdlio 内核

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:目标文件(如 stdoutstderrFILE* 文件指针)
  • format:格式化字符串(类似 printf
  • ...:可变参数
  • 返回值:成功时返回写入的字符数,失败返回负值。
+--------------------------+    格式化转换    +-------------------+    写入文件
|  变量 (age, score,add)   |  ------------>  | 格式化后的字符串    | ------------> log.txt
+--------------------------+                 +-------------------+

在这里插入图片描述


int fscanf(FILE *stream, const char *format, ...);  // 格式化读取内存

strem(文件流)中按照format的格式匹配数据,转换数据并存储到变量当中。

  • stream:源文件(如 stdinFILE* 文件指针)
  • 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);

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

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

相关文章

【MYSQL】笔记

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 在ubuntu中&#xff0c;改配置文件&#xff1a; sudo nano /etc/mysql/mysql.conf.d/mysq…

线程池核心线程永续机制:从源码到实战的深度解析

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

DS新论文解读(2)

上一章忘了说论文名字了&#xff0c;是上图这个名字 我们继续&#xff0c;上一章阅读地址&#xff1a; dsv3新论文解读&#xff08;1&#xff09; 这论文剩下部分值得说的我觉得主要就是他们Infra通信的设计 先看一个图 这个是一个标准的h800 8卡with 8cx7 nic的图&#xf…

html文件cdn一键下载并替换

业务场景&#xff1a; AI生成的html文件&#xff0c;通常会使用多个cdn资源、手动替换or下载太过麻烦、如下py程序为此而生&#xff0c;指定html目录自动下载并替换~ import os import requests from bs4 import BeautifulSoup from urllib.parse import urlparse import has…

【ROS2】 核心概念6——通信接口语法(Interfaces)

古月21讲/2.6_通信接口 官方文档&#xff1a;Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战&#xff1a;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手机号码归属地批量查询与分类导出方案 应用场景 ​​市场营销​​&#xff1a;企业根据手机号码归属地进行精准营销&#xff0c;按城市或省份分类制定针对性推广策略​​客户管理​​&#xff1a;快速对客户手机号码进行归属地分类&#xff0c;便于后续客户关系管理​​数…

ctf 基础

一、软件安装和基本的网站&#xff1a; 网安招聘网站 xss跨站脚本攻击 逆向&#xff1a;可以理解为游戏里的外挂 pwn最难的题目 密码学&#xff1a; 1、编码&#xff1a;base64 2、加密&#xff1a;凯撒 3、摘要&#xff1a;MD5、SHA1、SHA2 调查取证&#xff1a;杂项&am…

CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】

一、环境 二、命令及含义 fdisk ‌ ‌ fdisk‌是一个较老的分区表创建和管理工具&#xff0c;主要支持MBR&#xff08;Master Boot Record&#xff09;格式的分区表。MBR分区表支持的硬盘单个分区最大容量为2TB&#xff0c;最多可以有4个主分区。fdisk通过命令行界面进行操…

AI agent与lang chain的学习笔记 (1)

文章目录 智能体的4大要素一些上手的例子与思考。创建简单的AI agent.从本地读取文件&#xff0c;然后让AI智能体总结。 也可以自己定义一些工具 来完成一些特定的任务。我们可以使用智能体总结一个视频。用户可以随意问关于视频的问题。 智能体的4大要素 AI 智能体有以下几个…

谢赛宁团队提出 BLIP3-o:融合自回归与扩散模型的统一多模态架构,开创CLIP特征驱动的图像理解与生成新范式

BLIP3-o 是一个统一的多模态模型&#xff0c;它将自回归模型的推理和指令遵循优势与扩散模型的生成能力相结合。与之前扩散 VAE 特征或原始像素的研究不同&#xff0c;BLIP3-o 扩散了语义丰富的CLIP 图像特征&#xff0c;从而为图像理解和生成构建了强大而高效的架构。 此外还…

【idea】调试篇 idea调试技巧合集

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

二叉树深搜:在算法森林中寻找路径

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …

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设计一个类&#xff0c;无法被继承2.5设计一个类。这个类只能创建一个对象【单例模式】2.5.1懒汉模式实现2.5.2饿汉模…

Android 手写签名功能详解:从原理到实践

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

Level2.8蛇与海龟(游戏)

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

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期&#xff0c;在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后&#xff0c;要想在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"…