当前位置: 首页 > news >正文

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),内核每打开一个文件就会分配一个文件描述符。
  • 默认文件描述符
    • 0STDIN_FILENO(标准输入,对应stdin)。
    • 1STDOUT_FILENO(标准输出,对应stdout)。
    • 2STDERR_FILENO(标准错误,对应stderr)。

2. 文件I/O函数接口

  • open
    • 函数原型:int open(const char *pathname, int flags, int mode);
    • 功能:打开文件并返回文件描述符。
    • 参数:
      • pathname:文件名。
      • flags:打开文件的模式(如O_RDONLYO_WRONLYO_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_SETSEEK_CURSEEK_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
fopenopen
fputc / fgetcwrite / read
fputs / fgetswrite / read
fwrite / freadwrite / read
fcloseclose
fseeklseek
ftelllseek
rewindlseek(fd, 0, SEEK_SET)

8. 其他注意事项

  • 文件描述符的最大值:1024(范围0-1023),可通过ulimit -a查看。
  • 阻塞与非阻塞
    • 阻塞:程序因某种条件未触发而暂停执行。
    • 非阻塞:程序继续执行,不等待条件触发。

9. 总结

文件I/O是操作系统提供的底层接口,适用于设备相关的开发。与标准I/O相比,文件I/O没有缓存,操作对象是文件描述符。通过openreadwriteclose等函数可以实现文件的读写操作。文件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…...

实战:如何快速让新网站被百度收录?

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录&#xff0c;可以采取以下实战策略&#xff1a; 一、网站基础优化 网站结构清晰&#xff1a;确保网站的结构简洁清晰&#xff0c;符合百度的抓取规则。主…...

PhotoShop中JSX编辑器安装

1.使用ExtendScript Tookit CC编辑 1.安装 打开CEP Resource链接&#xff1a; CEP-Resources/ExtendScript-Toolkit at master Adobe-CEP/CEP-Resources (github.com) 将文件clone到本地或者下载到本地 点击AdobeExtendScriptToolKit_4_Ls22.exe安装&#xff0c;根据弹出的…...

01-时间与管理

时间与效率 一丶番茄时钟步骤好处 二丶86400s的财富利用时间的方法每天坚持写下一天计划 自我管理体系计划-行动-评价-回顾 一丶番茄时钟 一个计时器 一份任务清单,任务 步骤 每一个25分钟是一个番茄时钟 将工作时间划分为若干个25分钟的工作单元期间只专注于当前任务,遇到…...

MiniMax-01技术报告解读

刚刚MiniMax发布了MiniMax-01&#xff0c;简单测试了效果&#xff0c;感觉不错。于是又把它的技术报告看了一下。这种报告看多了&#xff0c;就会多一个毛病&#xff0c;越来越觉得自己也能搞一个。 这篇文章我觉得最有意思的一句是对数据质量的强调“低质量数据在训练超过两个…...

多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新——从DeepSeek看下一代语言模型的高效之路

多头潜在注意力&#xff08;MLA&#xff09;&#xff1a;让大模型“轻装上阵”的技术革新 ——从DeepSeek看下一代语言模型的高效之路 大模型的“内存焦虑” 当ChatGPT等大语言模型&#xff08;LLM&#xff09;惊艳世界时&#xff0c;很少有人意识到它们背后隐藏的“内存焦虑”…...

哈希表实现

目录 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指令&#xff1a; 文件&#xff1a; touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向&#xff08;Redirection&#xff09; 2. 管道&#xff08;Pipes&a…...

Ubuntu安装VMware17

安装 下载本文的附件&#xff0c;之后执行 sudo chmod x VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle sudo ./VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle安装注意事项&#xff1a; 跳过账户登录的办法&#xff1a;断开网络 可能出现的问题以及解决…...

3个变革性步骤:用163MusicLyrics彻底解决歌词获取难题

3个变革性步骤&#xff1a;用163MusicLyrics彻底解决歌词获取难题 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字化音乐时代&#xff0c;歌词已不再是简单的文字附…...

纹理识别必备!5个高质量数据集下载与使用指南(附避坑技巧)

纹理识别实战指南&#xff1a;五大高价值数据集深度解析与应用技巧 纹理识别作为计算机视觉领域的重要分支&#xff0c;在工业质检、自动驾驶、医疗影像等场景中发挥着关键作用。但许多开发者在数据集获取和预处理阶段就会遇到各种"暗坑"——从下载链接失效到标注格式…...

LeetCode 102. Binary Tree Level Order Traversal 题解

LeetCode 102. Binary Tree Level Order Traversal 题解 题目描述 给你二叉树的根节点 root&#xff0c;返回其节点值的 层序遍历。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输…...

运维实战:思科NAT配置全解析与典型场景应用

1. 为什么企业网络离不开NAT技术 想象一下你公司的内网有200台电脑&#xff0c;但ISP只分配了5个公网IP地址——这就是NAT技术大显身手的场景。作为网络工程师&#xff0c;我处理过太多类似案例&#xff0c;最夸张的一个客户用1个公网IP支撑了整个500人办公区的上网需求。 NA…...

Qwen3-ASR-0.6B开发者案例:为小程序集成实时语音转写能力的技术路径

Qwen3-ASR-0.6B开发者案例&#xff1a;为小程序集成实时语音转写能力的技术路径 1. 项目背景与需求 最近接到一个很有意思的需求&#xff1a;一家在线教育公司想要在他们的微信小程序里加入实时语音转写功能。想象一下这个场景——老师在手机上讲课&#xff0c;学生的手机屏幕…...

保姆级教程:在PVE上5分钟搞定一个Ubuntu LXC容器,并配置好Docker环境

5分钟极速部署&#xff1a;PVE上Ubuntu LXC容器与Docker环境全自动配置指南 刚接触家庭服务器的朋友往往被复杂的虚拟化环境劝退。今天分享的这套方案&#xff0c;能让你在PVE平台上用不到5分钟时间&#xff0c;快速获得一个开箱即用的Ubuntu容器&#xff0c;并预装好Docker环境…...

Aircrack-ng进阶指南:如何高效生成和使用密码字典提升破解成功率

Aircrack-ng高阶实战&#xff1a;密码字典工程的艺术与科学 在网络安全领域&#xff0c;密码字典的质量往往决定了渗透测试的成败。就像锁匠需要精心打造的开锁工具一样&#xff0c;安全研究人员需要构建精准高效的密码字典来评估系统安全性。本文将深入探讨如何通过系统化的字…...

MCP协议实战踩坑:当Claude Desktop遇上n8n 1.93.0的混合通信

MCP协议深度解析&#xff1a;从混合通信模型看AI Agent生态兼容性挑战 当Claude Desktop与n8n 1.93.0的MCP协议实现相遇时&#xff0c;表面上的连接故障背后隐藏着AI Agent通信架构的深层设计哲学差异。本文将带您穿透现象看本质&#xff0c;揭示不同MCP实现方案背后的技术权衡…...

HarmonyOS开发入门:DevEco Studio工程目录结构详解与实战配置

HarmonyOS开发实战&#xff1a;深度解析DevEco Studio工程架构与高效配置策略 当你第一次在DevEco Studio中创建HarmonyOS项目时&#xff0c;是否曾被复杂的目录结构弄得一头雾水&#xff1f;作为华为全场景智能生态的核心开发工具&#xff0c;DevEco Studio采用了一套精心设计…...

深度解析CloverBootloader内存管理:AptioMemoryFix原理与实现详解

深度解析CloverBootloader内存管理&#xff1a;AptioMemoryFix原理与实现详解 【免费下载链接】CloverBootloader Bootloader for macOS, Windows and Linux in UEFI and in legacy mode 项目地址: https://gitcode.com/gh_mirrors/cl/CloverBootloader CloverBootloade…...