【文件I/O】文件持久化
这篇文章详细讲解的是 理解在Linux操作系统中输入/输出(I/O)编程与文件操作的关系。
在计算机编程中,输入/输出编程(I/O 编程) 是一个重要的概念,指的是通过程序与外部世界(如用户输入、文件、设备等)进行数据交换的过程。文件操作是 I/O 编程中最常见的应用场景之一,通过文件操作可以对数据进行持久化存储。
这篇文章也是I/O编程的最为基础的知识,我将会从 I/O 编程、文件的分类、与文件相关的 I/O 操作 和 持久化数据的实现 等方面展开说明。
输入/输出编程的基础
什么是 I/O?
- input 输入:将外部数据输入到程序中,例如键盘输入、文件读取、网络数据接收等。
- output 输出:将程序数据输出到外部,例如打印到屏幕、写入文件、发送网络数据等。
I/O 的作用
- I/O 编程的核心任务是 将程序的操作作用于某种 I/O 对象(如文件、设备、网络接口等)。
- 文件 是最常见的 I/O 对象之一,程序通过文件 I/O 操作实现数据的存储和读取。
I/O 编程中的“文件”
- 在操作系统中,“文件”是一个广义的概念,指的是可以进行数据存储的抽象对象。
- 而 I/O编程 中的文件不仅仅指磁盘上的普通文本文件,还包括设备文件、管道文件、网络文件等。
文件的分类(7种文件类型)
在 Linux 操作系统中,文件分为以下几种类型:
文件类型 | 描述 |
---|---|
普通文件 - | 常见的文本文件、二进制文件、源代码文件等。 |
目录文件 | 目录本质上也是一种文件,存储了目录下的文件列表及其元数据。 |
链接文件 | 指向另一个文件的引用,可以是软链接(符号链接)或硬链接。 |
设备文件 | 表示硬件设备,包括字符设备(如键盘)和块设备(如磁盘)。 |
管道文件 | 用于进程间通信的文件,分为命名管道(FIFO)和匿名管道。 |
套接字文件 | 用于网络通信的文件,表示网络连接的端点。 |
内存映射文件 | 文件与内存直接映射,用于高效的文件读取和写入操作。 |
- 文件的广义理解:
- 本质:在 Linux 中,所有可以进行 I/O 操作的对象都可以看作文件。
- 统一接口:文件、设备、网络等都可以通过统一的文件描述符和 I/O 系统调用进行访问。
对文件进行 I/O 操作
文件 I/O 的概念:
文件 I/O 指的是通过编程对文件进行 读(Read) 和 写(Write) 的操作。通过文件 I/O,可以实现数据的持久化存储、文件内容的处理等。
文件 I/O 的基本操作
文件操作通常包括以下步骤:
- 打开文件:通过
open()
或fopen()
打开文件,获取文件描述符或文件指针。 - 读写文件:
- 读取文件:通过
read()
或fread()
从文件中获取数据。 - 写入文件:通过
write()
或fwrite()
将数据写入文件。
- 读取文件:通过
- 关闭文件:通过
close()
或fclose()
关闭文件,释放资源。
文件操作的示例
使用 C 语言实现文件 I/O 操作:
#include <stdio.h>
#include <stdlib.h>int main() {// 打开文件进行写入FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("Error opening file");return 1;}// 写入数据fprintf(file, "Hello, world!\n");fprintf(file, "This is a test file.\n");// 关闭文件fclose(file);// 打开文件进行读取file = fopen("example.txt", "r");if (file == NULL) {perror("Error opening file");return 1;}// 读取数据char buffer[256];while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer);}// 关闭文件fclose(file);return 0;
}
- 文件 I/O 的作用:
- 数据存储:将程序运行过程中产生的数据存储到文件中,便于后续使用。
- 数据读取:从外部文件中加载数据到程序中,作为程序的输入。
- 数据共享:通过文件在不同程序间传递数据。
将数据保留(文件持久化)
什么是持久化?
持久化是指 将程序中的数据保存到外部存储介质(如磁盘文件)中,以便程序退出后数据仍然可以被访问。
文件 I/O 和数据持久化的关系:
- 文件 I/O 是实现数据持久化的主要手段。
- 程序通过文件操作将数据写入文件,实现对数据的长期保存。
示例程序:将用户输入的数据保留到文件
任务:读取用户输入并将其保存到文件中:
#include <stdio.h>int main() {// 打开文件进行追加写入FILE *file = fopen("log.txt", "a");if (file == NULL) {perror("Error opening file");return 1;}// 获取用户输入并写入文件char input[256];printf("Enter some text: ");fgets(input, sizeof(input), stdin);fprintf(file, "%s", input);// 关闭文件fclose(file);printf("Data saved to log.txt\n");return 0;
}
- 输入/输出编程的本质
- I/O 编程的目标是将程序的 I/O 功能作用于某种 I/O 对象(如文件)。
- 文件是 I/O 编程的核心对象之一,通过文件操作可以实现数据的持久化和共享。
- 文件的种类
- 文件在 Linux 中有广义的定义,包括普通文件、设备文件、管道文件等。
- 文件操作的意义
- 文件 I/O 编程 是通过系统调用或库函数对文件进行读取和写入操作。
- 文件 I/O 是实现数据持久化的主要手段,可以将程序运行时的数据保留到文件中。
- 文件 I/O 编程的应用场景
- 数据存储:如配置文件、数据库文件。
- 数据读取:如加载程序输入、日志文件读取。
- 数据共享:如通过文件在程序之间传递信息。
通过输入/输出编程,程序可以高效地操作文件,实现数据的保存和共享,从而扩展程序的功能和应用范围。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【文件I/O】文件持久化
这篇文章详细讲解的是 理解在Linux操作系统中输入/输出(I/O)编程与文件操作的关系。 在计算机编程中,输入/输出编程(I/O 编程) 是一个重要的概念,指的是通过程序与外部世界(如用户输入、文件、…...

USB学习——基本概念
文章目录 USB(Universal Serial Bus)概述USB系统的描述USB总线传输方式USB的拓扑结构 USB的连接模型USB控制器及分类USB描述符USB 端点USB枚举过程USB 四种传输类型USB 事务批量传输(Bulk)中断传输(Interrupt)等时传输(Isochronous)控制传输(Control)端点…...

python-leetcode-三数之和
15. 三数之和 - 力扣(LeetCode) class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort() # 排序n len(nums)res []for i in range(n):# 剪枝:如果当前数 > 0,三数之和不可能为 0if nums[i]…...
springboot整合拦截器
1.首先创建拦截器类: package com.example.interceptor;import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.sp…...

B树与B+树:数据库索引的秘密武器
想象一下,你正在构建一个超级大的图书馆,里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式,它们都能帮助你快速找到想要的书籍,但各有特点。 B树就像是一个传统的图书馆摆放方式: 1. 书籍摆放&…...
Lua语言中常用的字符串操作函数
string.sub(s, i, j) 功能: 截取字符串 s 中从位置 i 到位置 j 的子字符串。 local s "Hello, Lua!" print(string.sub(s, 1, 5)) -- 输出 "Hello" print(string.sub(s, 8, 11)) -- 输出 "Lua!" string.len(s) 功能:将字符串长度…...
HOW - Form 表单确认校验两种模式(以 Modal 场景为例)
目录 一、背景二、具体1. 模式一:点击确认进行校验提示2. 模式二:确认按钮依赖于表单内容实现说明 一、背景 基于react、antd form分别实现如下两种模式: 1、一个 Modal,点击确认进行校验提示2、一个 Modal,确认按钮…...

LabVIEW部署Web服务
目录 LabVIEW部署Web服务1、创建项目2、创建Web服务3、新建WebVI3.1、使用GET方法3.2、使用POST方法 4、 部署和对应URL4.1、应用程序:80804.2、本地调试:80094.3、NI Web服务器:9090(禁用) 5、测试5.1、测试GET方法5.2、测试POST方法 6、实际…...

进程件通信——网络通信——TCP
网络抓包工具:wireshark 抓取经过设备网卡的数据。 操作: 1. sudo wireshark 2. 选择要抓取的网卡----》any 3. 设置抓取的过滤条件 4. 进行网络通信 5. 分析数据 UDP: 用户数据报协议 UDP: 用户数据报协议 特点ÿ…...

【数据库】三、SQL语言
文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…...
Python对象的序列化和反序列化工具:Joblib与Pickle
在Python中,序列化是将内存中的对象转换为可存储或传输的格式的过程。常见的序列化格式有JSON、YAML、Pickle和Joblib等。其中,Pickle和Joblib是最常用的用于序列化和反序列化Python对象的工具。虽然这两者有很多相似之处,但它们在某些方面有…...
Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
将 ProxySQL 配合 Spring Boot 使用,主要的目的是在 Spring Boot 应用程序中实现对 MySQL 主从同步的读写分离和负载均衡。这样,你可以利用 ProxySQL 自动将写操作路由到主库,而将读操作路由到从库。 1. 准备工作 确保你的 MySQL 主从同步环…...

量子计算遇上人工智能:突破算力瓶颈的关键?
引言:量子计算遇上人工智能——突破算力瓶颈的关键? 在数字化时代的浪潮中,人工智能(AI)正以前所未有的速度改变着我们的生活,从语音助手到自动驾驶,从医学诊断到金融分析,无不彰显其…...

【Unity插件】解决移动端UI安全区问题 - Safe Area Helper
在移动端设计界面时,必须要考虑的就是UI的安全区。 Unity本身也提供了Safearea的API。 但在asset store时已经有人提供了免费的插件(Safe Area Helper),我们可以直接使用。 插件链接: https://assetstore.unity.com/p…...
JSON.stringify 实现深度克隆的缺陷
在前端开发中,深克隆(Deep Clone)和浅克隆(Shallow Clone)是常见的操作。浅克隆和深克隆的区别主要体现在对象内部嵌套对象的处理方式上。 1. 浅克隆(Shallow Clone) 浅克隆是指创建一个新对象…...

深度解析如何使用Linux中的git操作
1.如何理解版本控制 →Git&&gitee||github 多版本控制面对善变的甲方 版本控制是一种用于管理文件或代码变更的系统,帮助团队或个人追踪项目的历史记录,并支持多方协作开发。它在软件开发和文档管理中尤为重要,但也适用于其他需要追…...

el-table 合并单元格
参考文章:vue3.0 el-table 动态合并单元格 - flyComeOn - 博客园 <el-table :data"tableData" border empty-text"暂无数据" :header-cell-style"{ background: #f5f7fa }" class"parent-table" :span-method"obj…...
Redis 三大问题:缓存穿透、缓存击穿、缓存雪崩
Redis 作为高性能的内存数据库,广泛应用于缓存场景。然而,在实际使用中,可能会遇到三大经典问题:缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致系统性能下降甚至崩溃。 1. 缓存穿透 问题描述 …...
常用字符串处理函数
常用字符串处理函数 strcspn函数原型参数说明返回值使用示例注意事项 strpbrk函数原型参数说明返回值使用示例 strcasecmp函数原型参数说明返回值使用示例注意事项 strcspn strcspn 是一个 C 和 C 标准库函数,用于计算一个字符串中不包含任何指定字符的最长前缀的长…...

Pathview包:整合表达谱数据可视化KEGG通路
Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包,其会先下载KEGG官网上的通路图,然后整合输入数据对通路图进行再次渲染,从而对KEGG通路图进行一定程度上的个性化处理,并且丰富其信息展示。(KEGG在线数…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...