Linux 基础入门操作 - 第5章 基础文件操作

server/2024/10/9 3:48:42/

@嵌入式Linux系统入门操作

第5章 基础文件操作

掌握文件操作比较重要的,作为嵌入式开发,需要理解文件的操作。 用到头文件是

#include“fcntl.h”

属于 POSIX(Portable Operating System Interface),是一个底层的系统调用,直接与操作系统交互。适合系统编程或需要直接控制底层文件操作的场景。

5.1 open 函数

系统调用 open 的作用是打开一个文件,并返回这个文件的描述符。

函数原型:

int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode );

参数说明:
path:准备打开的文件或设备名字。
oflags:指出要打开文件的访问模式。
O_RDONLY 【3 选 1】以只读方式打开
O_WRONLY 【3 选 1】以只写方式打开
O_RDWR 【3 选 1】以读写方式打开

O_APPEDN 【|可选】以追加方式打开
O_TRUNC 【|可选】把文件长度设为零,丢弃以后的内容。
O_CREAT 【|可选】如果需要,就按参数 mode 中给出的访问模式创建文件。
O_EXCL 【|可选】与 O_CREAT 一起调用,确保调用者创建出文件。使用这个模式可防止两个程序同时创建一个文件,如果文件已经存在,open 调用将失败。

mode:当使用 O_CREAT 标志的 open 来创建文件时,我们必须使用三个参数格式的 open 调用。
第三个参数 mode 是几个标志按位 OR 后得到的。
S_IRUSR:读权限,文件属主
S_IWUSR:写权限,文件属主
S_IXUSR:执行权限,文件属主
S_IRGRP:读权限,文件所属组
S_IWGRP:写权限,文件所属组
S_IXGRP:执行权限,文件所属组
S_IROTH:读权限,其他用户
S_IWOTH:写权限,其他用户
S_IXOTH:执行权限,其他用户

返回一个大于0的值,则成功,返回的是文件描述符。
返回一个等于0的值,则打开失败。
返回一个小于0的值,则出现错误,可以从错误errno中获取错误的状态。

5.2 close 函数

close系统调用用于“关闭”一个文件。文件描述符被释放,并能够重新使用。当一个进程终止时,内核自动关闭它所有打开的文件。很多程序都利用了这一功能而不显式地用close关闭文件。

函数的定义如下:

头文件:#include <unistd.h>  
函数原型: int close(int fd);  

参数: 文件描述符
函数返回值:close成功返回0,出错返回-1

5.3 read 函数

从文件描述符fd相关的文件中读取nbytes个字节的数据到buf中,返回实际读入的字节数。

头文件: #include <unistd.h>  
函数原型:  size_t read(int fd, void *buf, size_t nbytes);  

fd:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。
buf:缓冲区,用来存储读入的数据。
nbytes:要读取的字符数。
size_t:返回值,返回成功读取的字符数,它可能会小于请求的字节数。-1表示出现错误。

5.4 write函数

将字符串buf中前nbytes个字节的数据写入与文件描述符fd关联的文件中,返回实际写入的字节数

函数的定义如下:
头文件: #include <unistd.h>
函数原型:size_t write(int fd, const void *buf, size_t nbytes);
参数说明:
fd:文件描述符,目标文件。例如:fd的值为1,就向标准输出写数据,
buf:待写入的字符串。
nbytes:要写入的字符数。
size_t:函数返回值,返回成功写入文件的字符数。-1表示出现错误。

5.5 lseek函数

对文件描述符fd指定文件的读写指针进行设置,也就是说,它可以设置文件的下一个读写位置。
具体有以下三个作用

  • 调整文件读写位置‌:通过lseek函数,可以移动文件的读写指针到任意位置,无论是向前还是向后移动,这在进行随机访问文件时非常有用‌23。
  • 计算文件大小‌:通过lseek函数,可以设置文件的读写位置到文件末尾,然后通过返回值(从文件开头到当前读写位置的长度)来获取文件的大小‌24。
  • 作为文件拓展‌:在向文件末尾写入数据时,lseek函数可以用来扩展文件的大小,这在需要动态扩展文件时非常有用‌
#include <unistd.h>  
#include <sys/types.h>   
off_t lseek(int filedes, off_t offset, int whence);  

off_set:参数用来指定位置,偏移量,表示从whence指定的位置开始移动的字节数。可以是正数(向前移动),负数(向后移动),或者0(在whence指定的位置。

whence:参数定义该偏移值的用法。
whence可以取下列值
SEEK_SET:offset是一个绝对位置
SEEK_CUR:offset是相对于当前位置的一个相对位置
SEEK_END:offset是相对于文件尾的一个相对位置
off_t:lseek返回从文件到文件指针被设置处的字节偏移,失败时返回-1.
参数offset的类型off_t是一个与具体实现有关的整数类型,它定义在sys/types.h中

偏移量,表示从whence指定的位置开始移动的字节数。可以是正数(向前移动),负数(向后移动),或者0(在whence指定的位置

5.6 参考代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[]){int fd; char buf2[] = "hello world,today is beautiful"; //自定义读写用的缓冲区char buf[100];if((fd = open("file.txt",O_RDWR|O_CREAT|O_APPEND)) < 0 ) {//打开文件perror("open file failed\n");return -1;}elseprintf("open file successful\n");if(write(fd, buf2,strlen(buf2)) < 0 ){ //向文件中写入数据perror("write file failed\n");return -1;}elseprintf("write file  successful\n");if(close(fd) < 0 ) {  //关闭文件perror("close file failed\n");return -1;}elseprintf("close file successful\n");if(open("file.txt", O_RDWR) < 0 ) {   //打开文件perror("open file failed\n");return -1;}elseprintf("open file successful\n");if( read(fd, buf,100) < 0 ){//读取文件中的数据perror("read file failed\n");return -1;}else{printf("read data:\n");printf("%s\n",buf);//将读取的数据输出到控制台}if(close(fd) < 0) {perror("close file failed\n");return -1;}elseprintf("close file  successful\n");return 0;}

http://www.ppmy.cn/server/129078.html

相关文章

【springboot】简易模块化开发项目整合Swagger2

接上一项目【springboot】简易模块化开发项目整合MyBatis-plus&#xff0c;进行拓展项目 1.新建模块 右键项目→New→Module&#xff0c;新建一个模块 父项目选择fast-demo&#xff0c;命名为fast-demo-config&#xff0c;用于存放所有配置项 添加后&#xff0c;项目结构如图…

Docker搭建一款开源的文档管理系统

1.系统介绍 Wizard是一款开源的文档管理系统&#xff0c;它支持多种格式类型的文档管理&#xff0c;包括Markdown、Swagger和Table&#xff0c;以适应不同场景和需求下的文档管理需求。 1.1功能特点 开源免费&#xff1a;Wizard是一款完全免费的开源项目&#xff0c;用户可以…

对比 pandas 与 SQL

对比 pandas 与 SQL&#xff1a;使用 SQL 实现 pandas 的经典操作 在数据分析中&#xff0c;pandas 和 SQL 都是非常重要的工具。虽然它们工作在不同的环境中&#xff08;pandas 是 Python 的库&#xff0c;SQL 是查询数据库的语言&#xff09;&#xff0c;但许多操作是相似的…

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志&#xff0c;会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具&#xff0c;它可以更快的帮助开发者调试应用程序。 步入正题&#xff0c;看图说话。 点…

医疗革新:Spring Boot医院管理系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

BOS系统:企业运营的智能平台

引言 BOS&#xff08;Business Operating System&#xff0c;业务操作系统&#xff09;是一种为企业用户提供灵活、可扩展业务应用平台的系统。它能够支持企业快速响应市场变化&#xff0c;提高业务效率&#xff0c;并实现业务流程的优化。 什么是BOS系统&#xff1f; BOS系…

Windows的兼容性为什么这么强大?

Windows最厉害的地方就在于&#xff0c;不管你在啥硬件上安装Win95&#xff0c;都能够正常运行&#xff0c;然后系统会自动更新驱动。相反&#xff0c;Linux在不同的电脑上运行&#xff0c;就会出现各种问题。 为什么Windows兼容性会如此强大&#xff1f; 我们先来看看Window…

设计模式-模版方法模式

模版方法模式(Template Method):定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重新定义算法的某些定义步骤。 需要注意的是&#xff0c;一般的模板方法需要用 final 修饰&#xff0c;防止子类重写模板方法。…