【文件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在线数…...
ubuntu服务器部署ai应用如何通过taotoken实现多模型稳定调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Ubuntu 服务器部署 AI 应用如何通过 Taotoken 实现多模型稳定调用 在 Ubuntu 服务器上部署 AI 应用时,开发者常常面临一…...
基于ARM9工业平板与Linux的水质在线监测系统开发实践
1. 项目概述:当工业平板电脑遇上水质监测在环保、水产养殖、市政水务这些领域里,数据就是眼睛。过去,我们看水质,得靠人拿着采样瓶,一趟趟跑现场,再送回实验室,等上半天甚至几天才能拿到一份报告…...
别再只烧SD卡了!IMX6ULL的BOOT_CFG引脚配置详解(附正点原子核心板电路图)
IMX6ULL启动配置全解析:从BOOT_CFG引脚到多介质启动实战 当你在深夜调试IMX6ULL开发板时,是否遇到过这样的困境——明明按照教程操作,系统却始终无法从EMMC启动?问题的根源往往藏在那些容易被忽略的硬件细节中。今天,我…...
革命性开源定价引擎Lotus:如何快速构建灵活的SaaS计费系统
革命性开源定价引擎Lotus:如何快速构建灵活的SaaS计费系统 【免费下载链接】lotus Open Source Pricing & Packaging Infrastructure 项目地址: https://gitcode.com/gh_mirrors/lot/lotus 在当今竞争激烈的SaaS市场中,定价策略已成为决定产品…...
蓝桥杯嵌入式省赛串口通信实战:用STM32G431RBT6和CubeMX搞定数据收发与LCD显示
蓝桥杯嵌入式省赛串口通信实战:STM32G431RBT6与CubeMX高效开发指南 对于备战蓝桥杯嵌入式省赛的选手而言,串口通信与LCD显示的联动实现往往是比赛中的关键得分点。本文将围绕STM32G431RBT6开发板,通过CubeMX和Keil MDK5工具链,深入…...
设计个人日常用品消耗周期测算程序,测算洗护生活用品消耗速度,提前规划采购时间。
个人日常用品消耗周期测算程序——基于 Python 的生活消耗建模实验一、实际应用场景描述在城市生活中,大多数人都会遇到这些情况:- 洗发水、牙膏、洗衣液突然用完- 临时补货导致时间成本增加- 囤货过多造成过期或占用空间- 无法判断“多久买一次才合理”…...
告别mmWave Studio报错:手把手教你搞定AWR2243数据采集的6个常见故障
告别mmWave Studio报错:手把手教你搞定AWR2243数据采集的6个常见故障 毫米波雷达开发者在数据采集阶段常会遇到各种技术障碍。AWR2243作为工业级高频雷达模块,其配套的mmWave Studio软件在实际操作中可能出现多种报错,影响开发效率。本文将针…...
一线观察:赣州新房装修公司的可靠细节
上个月,有个老朋友找我帮他参谋新房装修的事。赣州章江新区某刚交付的高端盘,精装改毛坯,180平的大户型。他跟我说,前后跑了五六家装修公司,聊完最大的感觉是——云里雾里。报价单看不懂方案,总觉得藏着坑&…...
ToastFish:终极Windows通知栏摸鱼背单词神器,上班族必备的隐蔽学习工具
ToastFish:终极Windows通知栏摸鱼背单词神器,上班族必备的隐蔽学习工具 【免费下载链接】ToastFish 一个利用摸鱼时间背单词的软件。 项目地址: https://gitcode.com/GitHub_Trending/to/ToastFish 你是否厌倦了枯燥的背单词软件?Toas…...
RK3506J邮票孔核心板:三核A7架构如何重塑工业AIoT边缘设备设计
1. 项目概述:从一枚邮票孔核心板,看工业AIoT的“小而美”进化在嵌入式开发这个行当里待久了,你会发现一个有趣的现象:越是前沿的技术盛会,越能看见那些“小而美”的硬核产品。2025年7月的第九届瑞芯微开发者大会&#…...
