【文件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在线数…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
