2.文件IO
2.文件IO
- **1. 文件I/O概述**
- **2. 文件I/O函数接口**
- **3. 文件定位**
- **4. 文件描述符与文件流指针的转换**
- **5. 文件I/O与标准I/O的比较**
- **6. 练习与作业**
- **7. 文件I/O与标准I/O的对应关系**
- **8. 其他注意事项**
- **9. 总结**
1. 文件I/O概述
- 文件I/O:操作系统为了方便用户使用系统功能而提供的一组系统函数,称为系统调用。文件I/O是其中的一部分。
- 特性:
- 没有缓存区。
- 操作对象是文件描述符(
int
类型),而不是流(FILE*
)。 - 文件描述符是一个很小的非负整数(0-1023),内核每打开一个文件就会分配一个文件描述符。
- 默认文件描述符:
0
:STDIN_FILENO
(标准输入,对应stdin
)。1
:STDOUT_FILENO
(标准输出,对应stdout
)。2
:STDERR_FILENO
(标准错误,对应stderr
)。
2. 文件I/O函数接口
- open:
- 函数原型:
int open(const char *pathname, int flags, int mode);
- 功能:打开文件并返回文件描述符。
- 参数:
pathname
:文件名。flags
:打开文件的模式(如O_RDONLY
、O_WRONLY
、O_RDWR
等)。mode
:文件权限(如0666
)。
- 返回值:成功返回文件描述符,失败返回
-1
。
- 函数原型:
- write:
- 函数原型:
ssize_t write(int fd, const void *buf, size_t count);
- 功能:向文件中写入数据。
- 参数:
fd
:文件描述符。buf
:要写入的数据缓冲区。count
:要写入的字节数。
- 返回值:成功返回实际写入的字节数,失败返回
-1
。
- 函数原型:
- read:
- 函数原型:
ssize_t read(int fd, void *buf, size_t count);
- 功能:从文件中读取数据。
- 参数:
fd
:文件描述符。buf
:存放读取数据的缓冲区。count
:要读取的字节数。
- 返回值:成功返回实际读取的字节数,失败返回
-1
,读到文件末尾返回0
。
- 函数原型:
- close:
- 函数原型:
int close(int fd);
- 功能:关闭文件描述符。
- 返回值:成功返回
0
,失败返回-1
。
- 函数原型:
3. 文件定位
- lseek:
- 函数原型:
off_t lseek(int fd, off_t offset, int whence);
- 功能:移动文件指针。
- 参数:
fd
:文件描述符。offset
:偏移量(正数向后偏移,负数向前偏移)。whence
:起始位置(SEEK_SET
、SEEK_CUR
、SEEK_END
)。
- 返回值:成功返回偏移量,失败返回
-1
。
- 函数原型:
- lseek与fseek的区别:
lseek
不支持O_APPEND
模式,无法生成空洞文件。lseek
在设备文件上偏移无效。
4. 文件描述符与文件流指针的转换
- fileno:
- 函数原型:
int fileno(FILE *stream);
- 功能:将文件流指针(
FILE*
)转换为文件描述符(int
)。 - 返回值:成功返回文件描述符,失败返回
-1
。
- 函数原型:
- fdopen:
- 函数原型:
FILE *fdopen(int fd, const char *mode);
- 功能:将文件描述符(
int
)转换为文件流指针(FILE*
)。 - 参数:
fd
:文件描述符。mode
:打开模式(如"r"
、"w"
等)。
- 返回值:成功返回文件流指针,失败返回
NULL
。
- 函数原型:
5. 文件I/O与标准I/O的比较
- 文件I/O:
- 无缓存,直接操作文件描述符。
- 适用于底层设备开发,效率和安全性较低。
- 标准I/O:
- 有缓存,操作对象是文件流指针(
FILE*
)。 - 适用于上层开发,效率高且移植性好。
- 有缓存,操作对象是文件流指针(
6. 练习与作业
- 练习1:使用文件I/O测试无缓存特性,验证终端和文件的直接读写。
- 练习2:封装一个简单的
printf
函数,支持缓存和直接输出。 - 作业1:使用文件I/O完成两个文件的比较功能,测试文件是否相等。
- 作业2:使用文件I/O向终端输出100以内的所有偶数。
7. 文件I/O与标准I/O的对应关系
标准I/O | 文件I/O |
---|---|
fopen | open |
fputc / fgetc | write / read |
fputs / fgets | write / read |
fwrite / fread | write / read |
fclose | close |
fseek | lseek |
ftell | lseek |
rewind | lseek(fd, 0, SEEK_SET) |
8. 其他注意事项
- 文件描述符的最大值:1024(范围0-1023),可通过
ulimit -a
查看。 - 阻塞与非阻塞:
- 阻塞:程序因某种条件未触发而暂停执行。
- 非阻塞:程序继续执行,不等待条件触发。
9. 总结
文件I/O是操作系统提供的底层接口,适用于设备相关的开发。与标准I/O相比,文件I/O没有缓存,操作对象是文件描述符。通过open
、read
、write
、close
等函数可以实现文件的读写操作。文件I/O与标准I/O各有优缺点,开发时应根据需求选择合适的I/O方式。
相关文章:
2.文件IO
2.文件IO **1. 文件I/O概述****2. 文件I/O函数接口****3. 文件定位****4. 文件描述符与文件流指针的转换****5. 文件I/O与标准I/O的比较****6. 练习与作业****7. 文件I/O与标准I/O的对应关系****8. 其他注意事项****9. 总结** 1. 文件I/O概述 文件I/O:操作系统为了…...

毕业设计--具有车流量检测功能的智能交通灯设计
摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…...

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…...

设计模式的艺术-策略模式
行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解策略模式 在策略模式中,可以定义一些独立的类来封装不同的算法,每个类封装一种具体的算法。在这里,每个封装算法的类都可以称之为一种策略(Strategy…...

【memgpt】letta 课程1/2:从头实现一个自我编辑、记忆和多步骤推理的代理
llms-as-operating-systems-agent-memory llms-as-operating-systems-agent-memory内存 操作系统的内存管理...
动态规划DP 最长上升子序列模型 合唱队形(题目分析+C++完整代码)
概览检索 动态规划DP 最长上升子序列模型 合唱队形 原题链接 AcWiing 482. 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的 (N−K)位同学出列,使得剩下的 K位同学排成合唱队形。 合唱队形是指这样的一种队形:设 K位同学从左到右…...
【踩坑】解决Hugging-face下载问题
解决Hugging-face下载问题 问题1:couldnt connect to https://huggingface.co问题2:HTTPSConnectionPool(hostcdn-lfs-us-1.hf-mirror.com, port443)设置hf_transfer加快速度 问题3:requests.exceptions.ChunkedEncodingError: (Connection b…...

Spring AI 在微服务中的应用:支持分布式 AI 推理
1. 引言 在现代企业中,微服务架构 已成为开发复杂系统的主流方式,而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI,使多个服务可以协同完成 AI 任务,并支持分布式 AI 推理&#x…...

5.3.2 软件设计原则
文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…...

java求职学习day20
1 在线考试系统 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 软件的需求分析 在线考试系统的主要功能分析如下: ( 1 )学员系统 (1.1)用户模块&…...

Python NumPy(8):NumPy 位运算、NumPy 字符串函数
1 NumPy 位运算 位运算是一种在二进制数字的位级别上进行操作的一类运算,它们直接操作二进制数字的各个位,而不考虑数字的整体值。NumPy 提供了一系列位运算函数,允许对数组中的元素进行逐位操作,这些操作与 Python 的位运算符类似…...
日志2025.1.30
日志2025.1.30 1.简略地做了一下交互系统 public class Interactable : MonoBehaviour { private MeshRenderer renderer; private Material defaultMaterial; public Material highlightMaterial; private void Awake() { renderer GetComponentInChildren<Me…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...

PhotoShop中JSX编辑器安装
1.使用ExtendScript Tookit CC编辑 1.安装 打开CEP Resource链接: CEP-Resources/ExtendScript-Toolkit at master Adobe-CEP/CEP-Resources (github.com) 将文件clone到本地或者下载到本地 点击AdobeExtendScriptToolKit_4_Ls22.exe安装,根据弹出的…...
01-时间与管理
时间与效率 一丶番茄时钟步骤好处 二丶86400s的财富利用时间的方法每天坚持写下一天计划 自我管理体系计划-行动-评价-回顾 一丶番茄时钟 一个计时器 一份任务清单,任务 步骤 每一个25分钟是一个番茄时钟 将工作时间划分为若干个25分钟的工作单元期间只专注于当前任务,遇到…...

MiniMax-01技术报告解读
刚刚MiniMax发布了MiniMax-01,简单测试了效果,感觉不错。于是又把它的技术报告看了一下。这种报告看多了,就会多一个毛病,越来越觉得自己也能搞一个。 这篇文章我觉得最有意思的一句是对数据质量的强调“低质量数据在训练超过两个…...
多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新——从DeepSeek看下一代语言模型的高效之路
多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新 ——从DeepSeek看下一代语言模型的高效之路 大模型的“内存焦虑” 当ChatGPT等大语言模型(LLM)惊艳世界时,很少有人意识到它们背后隐藏的“内存焦虑”…...
哈希表实现
目录 1. 哈希概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因子 1.4 将关键字转为整型 1.5 哈希函数 1.5.1 除法散列法/除留余数法 1.5.2 乘法散列法 1.5.3 全域散列法 1.5.4 其他方法 1.6 处理哈希冲突 1.6.1 开放定址法 1.6.1.1 线性探测 1.6.1.2 二次探测 1.6.…...

Linux的常用指令的用法
目录 Linux下基本指令 whoami ls指令: 文件: touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向(Redirection) 2. 管道(Pipes&a…...
Ubuntu安装VMware17
安装 下载本文的附件,之后执行 sudo chmod x VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle sudo ./VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle安装注意事项: 跳过账户登录的办法:断开网络 可能出现的问题以及解决…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...