文件的打开与关闭

embedded/2025/3/31 2:01:38/

文件操作是编程中的一个非常重要的部分,特别是在处理外部数据或持久化存储时。在C语言中,文件的操作涉及到打开文件、关闭文件以及对文件进行读写等操作。本文将深入探讨文件的打开与关闭,解释每个步骤的实现原理,并通过代码示例详细讲解。

一、文件打开的原理与实现

1.1 文件的打开

在C语言中,文件的打开是通过 fopen() 函数完成的。fopen() 函数的作用是返回一个文件指针(FILE *),它是指向文件内部结构体的一个指针,该结构体包含了文件的状态和指向文件内容的指针。

fopen() 函数

fopen() 的函数原型如下:

FILE *fopen(const char *filename, const char *mode);
  • filename:表示要打开的文件名,或者是文件的路径。
  • mode:表示打开文件的方式,包括只读、只写、读写、附加等。

文件打开时,操作系统会通过内核和文件系统将文件加载到内存中。具体来说,操作系统会为文件分配一个文件描述符,并创建一个文件流(FILE *)来进行后续的文件操作。fopen() 其实是通过系统调用(如 open())与操作系统进行交互来完成文件的打开。

常见的文件打开模式
模式描述
"r"以只读方式打开文件。如果文件不存在,返回 NULL。文件指针放置在文件的开头。
"w"以只写方式打开文件。如果文件不存在,则创建文件;如果文件存在,则清空文件内容。
"a"以追加模式打开文件。写入的内容将被追加到文件末尾。如果文件不存在,则创建文件。
"r+"以读写方式打开文件。如果文件不存在,返回 NULL。文件指针放置在文件的开头。
"w+"以读写方式打开文件。如果文件不存在,则创建文件;如果文件存在,则清空文件内容。
"a+"以读写模式打开文件,数据将追加到文件的末尾。如果文件不存在,则创建文件。
1.2 文件打开的实现原理

在操作系统层面,fopen() 会调用低级的系统调用如 open() 来完成文件的打开。操作系统会进行以下步骤:

  1. 查找文件路径:操作系统会根据 filename 字符串查找文件路径。
  2. 获取文件描述符:如果文件存在且有访问权限,操作系统会返回一个文件描述符(通常是一个整数),用来标识文件。
  3. 创建文件流:C标准库会创建一个 FILE * 文件流,文件流包含了文件描述符和文件相关的状态信息。
  4. 设置文件指针位置:根据模式的不同,文件指针会被设置到文件的不同位置。例如,r 模式会将文件指针设置到文件开头,而 a 模式会将文件指针设置到文件末尾。
示例代码:文件打开
#include <stdio.h>int main()

http://www.ppmy.cn/embedded/177384.html

相关文章

【蓝桥杯速成】| 14.背包归来

题目一&#xff1a;目标和 问题描述 494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff…

基于HTML5的3D魔方项目开发实践

基于HTML5的3D魔方项目开发实践 这里写目录标题 基于HTML5的3D魔方项目开发实践项目概述核心技术实现1. 3D效果实现CSS3 3D变换魔方结构设计 2. 交互控制实现动画控制键盘控制触摸控制 技术难点与解决方案1. 3D变换控制2. 触摸体验优化3. 动画性能优化 项目收获总结项目展望 项…

批量配置Linux ~/.bash_profile

前提是服务器已配置好免密登录 scp&#xff08;Secure Copy&#xff09; scp&#xff08;Secure Copy&#xff09;是 Linux 中基于 SSH 协议的安全文件传输命令&#xff0c;用于在本地主机和远程主机之间&#xff08;或两个远程主机之间&#xff09;复制文件或目录。 基本语法…

std::string不是直接的 DATETIME类型,因此在插入数据库时,通常可以直接将这个字符串传递给数据库,它会自动将其转换为 DATETIME类型

将 current_time 转换为数据库中的 DATETIME 类型&#xff0c;那么首先需要确保 current_time 的格式适应数据库的日期时间类型。对于 MySQL&#xff0c;DATETIME 类型通常期望字符串格式为 YYYY-MM-DD HH:MM:SS&#xff0c;这个格式与我们通过 std::put_time 获取的字符串格式…

uniapp编译小程序报错,v-for中,非 h5 平台 :key 不支持表达式 chart+‘_‘

在 UniApp 里&#xff0c;当使用 v-for 指令进行列表渲染时&#xff0c;为了提升渲染性能与准确性&#xff0c;需要给每个列表项绑定一个唯一的 :key。不过在非 H5 平台&#xff0c;key 不支持表达式&#xff0c;只能是一个简单的值。下面为你提供几种解决该报错的办法&#xf…

NLP高频面试题(十九)——VLLM推理加速原理

随着大语言模型的快速发展&#xff0c;其推理效率逐渐成为应用落地的关键瓶颈。vLLM作为近年来备受关注的LLM推理框架&#xff0c;以其高效的推理性能脱颖而出。本文将深入浅出地介绍vLLM背后的两大核心技术&#xff1a;Continuous Batching 和 PagedAttention。 一、Continuo…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分页表格拖拽排序

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

渗透测试过-关于学习Token、JWT、Cookie等验证授权方式的总结

关于学习Token、JWT、Cookie等验证授权方式的总结 目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个…