Linux文件IO(二)-文件操作使用详解

embedded/2024/11/10 12:13:50/

前篇已经讲过open打开文件的操作使用,本篇文章介绍剩余的wirte、read、close、lseek等操作。

1.write写文件

调用 write 函数可向打开的文件写入数据,其函数原型如下所示(可通过"man 2 write"查看):

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

首先使用 write 函数需要先包含 unistd.h 头文件。

函数参数和返回值含义如下:

**fd:**文件描述符。关于文件描述符,前面已经给大家进行了简单地讲解,这里不再重述!我们需要将进行写操作的文件所对应的文件描述符传递给 write 函数。

**buf:**指定写入数据对应的缓冲区。

**count:**指定写入的字节数。

**返回值:**如果成功将返回写入的字节数(0 表示未写入任何字节),如果此数字小于 count 参数,这不是错误,譬如磁盘空间已满,可能会发生这种情况;如果写入出错,则返回-1。

对于普通文件(我们一般操作的大部分文件都是普通文件,譬如常见的文本文件、二进制文件等),不管是读操作还是写操作,一个很重要的问题是:从文件的哪个位置开始进行读写操作?也就是 IO 操作所对应的位置偏移量,读写操作都是从文件的当前位置偏移量处开始,当然当前位置偏移量可以通过 lseek 系统调用进行设置,关于此函数后面再讲;默认情况下当前位置偏移量一般是 0,也就是指向了文件起始位置,当调用 read、write 函数读写操作完成之后,当前位置偏移量也会向后移动对应字节数,譬如当前位置偏移量为 1000 个字节处,调用 write()写入或 read()读取 500 个字节之后,当前位置偏移量将会移动到 1500 个字当调用 read、write 函数读写操作完成之后,当前位置偏移量也会向后移动对应字节数,譬如当前位置偏移量为 1000 个字节处,调用 write()写入或 read()读取 500 个字节之后,当前位置偏移量将会移动到 1500 个字节处。

2.read读文件

调用 read 函数可从打开的文件中读取数据,其函数原型如下所示(可通过"man 2 read"查看):

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

首先使用 read 函数需要先包含 unistd.h 头文件。

函数参数和返回值含义如下:

**fd:**文件描述符。与 write 函数的 fd 参数意义相同。

**buf:**指定用于存储读取数据的缓冲区。**count:**指定需要读取的字节数。

**返回值:**如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于 count 参数指定的字节数,也有可能会为 0,譬如进行读操作时,当前文件位置偏移量已经到了文件末尾。实际读取到的字节数少于要求读取的字节数,譬如在到达文件末尾之前有 30 个字节数据,而要求读取 100 个字节,则 read 读取成功只能返回 30;而下一次再调用 read 读,它将返回 0(文件末尾)

3. close关闭文件

可调用 close 函数关闭一个已经打开的文件,其函数原型如下所示(可通过"man 2 close"查看):

#include <unistd.h>int close(int fd);

首先使用 close 函数需要先包含 unistd.h 头文件,当我们对文件进行 IO 操作完成之后,后续不再对文件进行操作时,需要将文件关闭。

函数参数和返回值含义如下:

**fd:**文件描述符,需要关闭的文件所对应的文件描述符。

**返回值:**如果成功返回 0,如果失败则返回-1。

除了使用 close 函数显式关闭文件之外,在 Linux 系统中,当一个进程终止时,内核会自动关闭它打开的所有文件,也就是说在我们的程序中打开了文件,如果程序终止退出时没有关闭打开的文件,那么内核会自动将程序中打开的文件关闭。很多程序都利用了这一功能而不显式地用 close 关闭打开的文件。

显式关闭不再需要的文件描述符往往是良好的编程习惯,会使代码在后续修改时更具有可读性,也更可靠,进而言之,文件描述符是有限资源,当不再需要时必须将其释放、归还于系统。

4. lseek读写指针位置

 

对于每个打开的文件,系统都会记录它的读写位置偏移量,我们也把这个读写位置偏移量称为读写偏移量,记录了文件当前的读写位置,当调用 read()或 write()函数对文件进行读写操作时,就会从当前读写位置偏移量开始进行数据读写。

读写偏移量用于指示 read()或 write()函数操作时文件的起始位置,会以相对于文件头部的位置偏移量来表示,文件第一个字节数据的位置偏移量为 0。

当打开文件时,会将读写偏移量设置为指向文件开始位置处,以后每次调用 read()、write()将自动对其进行调整,以指向已读或已写数据后的下一字节,因此,连续的调用 read()和 write()函数将使得读写按顺序递增,对文件进行操作。我们先来看看 lseek 函数的原型,如下所示(可通过"man 2 lseek"查看):

#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);

首先调用 lseek 函数需要包含<sys/types.h>和<unistd.h>两个头文件。

函数参数和返回值含义如下:

**fd:**文件描述符。

**offset:**偏移量,以字节为单位。

**whence:**用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):

  • SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);
  • SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
  • SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移。

**返回值:**成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1。

使用示例:

  • 将读写位置移动到文件开头处:
off_t off = lseek(fd, 0, SEEK_SET);
if (-1 == off)return -1;
  • 将读写位置移动到文件末尾:
off_t off = lseek(fd, 0, SEEK_END);if (-1 == off)return -1;
  • 将读写位置移动到偏移文件开头 100 个字节处:
off_t off = lseek(fd, 100, SEEK_SET);if (-1 == off)return -1;
  • 获取当前读写位置偏移量:
off_t off = lseek(fd, 0, SEEK_CUR);
if (-1 == off)return -1;

函数执行成功将返回文件当前读写位置


http://www.ppmy.cn/embedded/114077.html

相关文章

VS Code搭建LLVM(clang/clang++)编译环境(自己备用)

在MSYS2的MinGW64环境中&#xff0c;clang.exe工具是为了提供一种替代的C编译器。它基于LLVM项目&#xff0c;具有以下优势&#xff1a; 现代化特性&#xff1a;Clang支持最新的C标准和语言特性&#xff0c;提供更好的语法解析和错误提示。高效优化&#xff1a;Clang的优化技术…

PCL 计算点云距离

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 顾名思义,这个就是计算点云中每个点到另一个点云最近的距离,之后我们可以基于这些距离做一些预处理工作。思路其实很简单,通过对点云构建kdtree并采用并行的方式实现该计算过程。 二、实现代码 ColorRamp.h #ifn…

Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

概述 在Qt中&#xff0c;可以使用样式表&#xff08;StyleSheet&#xff09;来自定义 QMenu 的外观&#xff0c;包括其子项&#xff08;如菜单项QAction&#xff09;的颜色。但是&#xff0c;这通常可以设置 QMenu 的整体样式&#xff0c;而不能单独设置某个子项的颜色。不过&…

Excel 国产化替换新方案

前言 在当前数字化转型和信创&#xff08;信息技术应用创新&#xff09;战略背景下&#xff0c;企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件&#xff0c;SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…

info 命令:查看命令手册

一、命令简介 在 Linux 系统中&#xff0c;可以使用 man​ 查看普通的帮助手册。还可以使用 info​ 命令阅读 Info 格式的文档。 ​info​ 文档的特点&#xff1a;大量使用超链接&#xff0c;通过方向键将光标移动到链接的文字&#xff0c;按下回车键&#xff0c;就可以切换到…

JAVA虚拟机----JVM

(一)认识JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 &#xff08;二&#xff09;JVM运…

python脚本编译为.so速度对比

有两个好处&#xff1a; 产品代码保护&#xff0c;so文件不可读 计算能力加速&#xff0c;本质上编译过程为python -> c -> so文件&#xff0c;相当于动态语言转换为静态语言&#xff0c;程序执行能力和计算能力有所提升 编译为so文件后比原始python代码执行时间快2ms左…

Android mmap分析

Android mmap分析 mmap基础概念 mmap是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff0c;进程就可以采用指针的方式读写操作…