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

C语言文件操作-文件IO(系统调用)

  • 文件IO (系统调用)
    • 文件描述符
    • open函数
    • read函数
    • write函数
    • lseek函数
    • close函数
    • dup函数
    • dup2函数
  • stat函数
  • getpwuid函数
  • getgrgid函数
    • 实例
  • 目录操作
    • opendir函数
    • readdir函数
    • rewinddir函数
    • closedir函数
    • 实例

文件IO (系统调用)

文件IO就是系统调用,用户空间进入内核空间的过程就是系统调用。
系统调用没有缓冲机制,效率较低,可移植性也相对较差,实时性高。

文件描述符

文件描述符是使用open函数打开文件时的返回值

对文件的读写操作,就是通过文件描述符来完成的。

文件描述符是一个整数,在一个程序中文件描述符的范围0-1023共计1024个,

使用 uilmit -a 可以查看一个程序中可以打开的文件的个数限制

(open files 后面对应的就是 这个值也可以使用命令 ulimit -n 2048来修改 但一般都是用默认值)

在一个程序启动的过程中,默认就会打开三个描述符(0 1 2),

分别对应标准输入、标准输出、标准错误。

其他文件描述符需要通过open函数来打开文件,并获得文件描述符。

文件描述符依次递增,文件描述符遵循复用原则,文件描述符关闭后,这个符号就空闲了,可以被其他程序使用.

open函数

open函数用来打开文件,并返回文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);

参数:

  • pathname:要打开的文件的路径名
  • flags:打开文件的方式,可以是以下值:
    • O_RDONLY:只读方式打开

    • O_WRONLY:只写方式打开

    • O_RDWR:读写方式打开

    • O_CREAT:如果文件不存在,则创建文件

      • 如果指定了这个宏,则第三个参数 mode 必须填
      • 创建文件的权限还得涉及 掩码 umask
      • umask的值 默认为 0002 这个值也可以改的
      • 最终的权限 = (mode & ~umask)
      • 所以 即使给的是 0666 最终的权限也是 0664
    • O_APPEND:在文件尾部追加内容

    • O_TRUNC:如果文件存在,清空

    • O_EXCL:如果文件存在,则返回错误,错误码:EEXIST

  • mode:文件权限,一般八进制表示;

返回值:

  • 成功:返回文件描述符
  • 失败:返回-1,并设置errno

read函数

read函数用来从文件中读取内容。

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

参数:

  • fd:文件描述符
  • buf:读取到的数据存放的缓冲区
  • count:要读取的字节数

返回值:

  • 成功:返回实际读取的字节数
  • 失败:返回-1,并设置errno

write函数

write函数用来向文件中写入内容。

函数原型:

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

参数:

  • fd:文件描述符
  • buf:要写入的数据存放的缓冲区
  • count:要写入的字节数

返回值:

  • 成功:返回实际写入的字节数
  • 失败:返回-1,并设置errno

lseek函数

lseek函数用来移动文件读写指针的位置。

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

参数:

  • fd:文件描述符
  • offset:相对于 whence 的偏移量
  • whence:
    • SEEK_SET:相对于文件开始位置
    • SEEK_CUR:相对于当前位置
    • SEEK_END:相对于文件结束位置

返回值:

  • 成功:返回新的文件位置
  • 失败:返回-1,并设置errno

close函数

close函数用来关闭文件。

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

参数:

  • fd:文件描述符

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

dup函数

dup函数用来复制文件描述符。

#include <unistd.h>int dup(int oldfd);

参数:

  • oldfd:被复制的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno

dup2函数

dup2函数用来复制文件描述符并修改文件描述符。

#include <unistd.h>int dup2(int oldfd, int newfd);

参数:

  • oldfd:被复制的文件描述符
  • newfd:新的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno
  • 注意:如果newfd已经打开,则先关闭它。

stat函数

stat函数用来获取文件属性信息。

函数原型:

#include <sys/stat.h>int stat(const char *pathname, struct stat *buf);

参数:

  • pathname:文件路径名
  • buf:存放文件属性信息的结构体

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

结构体stat的定义如下:

struct stat {dev_t     st_dev;     //磁盘设备号ino_t     st_ino;     //inode节点号mode_t    st_mode;    //文件类型和权限st_mode & S_IFMT(0777) -> 文件权限获取文件的类型的方式: st_mode & S_IFMT 文件的类型S_IFMT     0170000   获取类型的掩码S_IFSOCK   0140000   套接字文件S_IFLNK    0120000   软链接文件S_IFREG    0100000   普通文件S_IFBLK    0060000   块设备文件S_IFDIR    0040000   目录文件S_IFCHR    0020000   字符设备文件S_IFIFO    0010000   管道文件例如:判断文件是否是普通文件if((stat.st_mode & S_IFMT) == S_IFREG)或者:if(S_ISREG(stat.st_mode))nlink_t   st_nlink;   //链接数uid_t     st_uid;     //所有者用户IDgid_t     st_gid;     //所有者组IDdev_t     st_rdev;    //设备号(若此对象为设备文件)off_t     st_size;    //文件大小(字节数)blksize_t st_blksize; //块大小(字节数)blkcnt_t  st_blocks;  //块数time_t    st_atime;   //最后访问时间time_t    st_mtime;   //最后修改时间time_t    st_ctime;   //最后状态改变时间#define st_atime st_atim.tv_sec//最后访问时间#define st_mtime st_mtim.tv_sec//最后修改时间#define st_ctime st_ctim.tv_sec//最后状态改变时间
};

函数: int lstat(const char *pathname, struct stat *statbuf);

可以获取链接的属性

getpwuid函数

getpwuid函数用来获取用户信息。

函数原型:

#include <pwd.h>struct passwd *getpwuid(uid_t uid);

参数:

  • uid:用户ID

返回值:

  • 成功:返回指向passwd结构体的指针
  • 失败:返回NULL,并设置errno

passwd结构体的定义如下:

struct passwd {char    *pw_name;    //用户名char    *pw_passwd;  //密码uid_t    pw_uid;     //用户IDgid_t    pw_gid;     //组IDchar    *pw_gecos;   //用户信息char    *pw_dir;     //用户主目录char    *pw_shell;   //用户登录shell
};

getgrgid函数

getgrgid函数用来获取组信息。

函数原型:

#include <grp.h>struct group *getgrgid(gid_t gid);

参数:

  • gid:组ID

返回值:

  • 成功:返回指向group结构体的指针
  • 失败:返回NULL,并设置errno

group结构体的定义如下:

struct group {char   *gr_name;    //组名char   *gr_passwd;  //组密码gid_t   gr_gid;     //组IDchar  **gr_mem;     //组成员列表
};

实例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{int fd;char buf[1024];struct passwd *pw;struct group *gr;struct stat st;//打开文件fd = open("test.txt", O_RDONLY, 0666);if (fd == -1) {perror("open");exit(1);}//读取文件内容read(fd, buf, 1024);printf("%s\n", buf);//关闭文件close(fd);//获取文件属性if (stat("test.txt", &st) == -1) {perror("stat");exit(1);}//获取文件所有者信息pw = getpwuid(st.st_uid);if (pw == NULL) {perror("getpwuid");exit(1);}printf("owner: %s\n", pw->pw_name);//获取文件所属组信息gr = getgrgid(st.st_gid);if (gr == NULL) {perror("getgrgid");exit(1);}printf("group: %s\n", gr->gr_name);return 0;
} 

目录操作

opendir函数

opendir函数用来打开目录。

函数原型:

#include <dirent.h>DIR *opendir(const char *name);

参数:

  • name:目录路径名

返回值:

  • 成功:返回指向DIR结构体的指针
  • 失败:返回NULL,并设置errno

DIR结构体:

struct dirent {ino_t     d_ino;     //inode节点号off_t     d_off;     //目录偏移量unsigned short d_reclen; //目录项长度unsigned char  d_type;  //目录项类型char        d_name[NAME_MAX+1]; //目录项名
};

readdir函数

readdir函数用来读取目录中的文件信息。

函数原型:

#include <dirent.h>struct dirent *readdir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

  • 成功:返回指向dirent结构体的指针
  • 失败:返回NULL,并设置errno

dirent结构体的定义如下:

struct dirent {ino_t     d_ino;     //inode节点号off_t     d_off;     //目录偏移量unsigned short d_reclen; //目录项长度unsigned char  d_type;  //目录项类型char        d_name[NAME_MAX+1]; //目录项名
};

rewinddir函数

rewinddir函数用来将目录读写指针指向文件头。

函数原型:

#include <dirent.h>void rewinddir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

closedir函数

closedir函数用来关闭目录。

函数原型:

#include <dirent.h>int closedir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

实例

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{DIR *dir;struct dirent *dp;struct stat st;//打开目录dir = opendir(".");if (dir == NULL) {perror("opendir");exit(1);}//读取目录中的文件信息while ((dp = readdir(dir)) != NULL) {printf("%s\n", dp->d_name);//获取文件属性if (lstat(dp->d_name, &st) == -1) {perror("lstat");exit(1);}//判断文件类型if (S_ISDIR(st.st_mode)) {printf("d");} else if (S_ISREG(st.st_mode)) {printf("-");} else if (S_ISLNK(st.st_mode)) {printf("l");} else if (S_ISFIFO(st.st_mode)) {printf("p");} else if (S_ISSOCK(st.st_mode)) {printf("s");} else {printf("?");}//获取文件所有者信息printf(" %d/%d ", st.st_uid, st.st_gid);//获取文件大小printf("%ld ", st.st_size);//获取文件修改时间printf("%s ", ctime(&st.st_mtime));}//关闭目录closedir(dir);return 0;
} 

相关文章:

C语言文件操作-文件IO(系统调用)

文件IO (系统调用) 文件描述符open函数read函数write函数lseek函数close函数dup函数dup2函数 stat函数getpwuid函数getgrgid函数 实例 目录操作 opendir函数readdir函数rewinddir函数closedir函数实例 文件IO (系统调用) 文件IO就是系统调用&#xff0c;用户空间进入内核空间…...

LeetCode67(二进制求和[位运算,大数运算])

二进制求和 题目要求: 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 这道题其实有几种解法.我们先来介绍简单的方法. 我们可以将两个字符串的二进制转成十进制,获取对应值相加之后,我们可以不断对2取余,获取尾数拼接即可.也就是像我们平常求一…...

grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录&#xff0c;若要编辑文件或对文件的某配置进行修改&#xff0c;就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具&#xff0c;用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…...

前端JS特效第26波:jQuery日期时间选择器插件

jQuery日期时间选择器插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html> <head lang"zh-CN"> <meta charset"UTF-8"> <title>jQuery日期时间选择器插件 - PHP中文网</t…...

Anaconda+Pycharm 项目运行保姆级教程(附带视频)

最近很多小白在问如何用anacondapycharm运行一个深度学习项目&#xff0c;进行代码复现呢&#xff1f;于是写下这篇文章希望能浅浅起到一个指导作用。 附视频讲解地址&#xff1a;AnacondaPycharm项目运行实例_哔哩哔哩_bilibili 一、项目运行前的准备&#xff08;软件安装&…...

java面试-java基础(上)

文章目录 一、什么是Java&#xff1f;特点&#xff1f;二、什么是JVM、JDK、JRE&#xff1f;三、java跨平台实现原理四、java数据类型有哪些?五、char能不能存一个中文汉字?六、存在数字i加1小于i或者i减1小于i?七、什么是自动类型转换与强制类型转换?八、什么是装/拆箱&am…...

STM32快速搭建项目框架

注&#xff1a;编写本博客的原因&#xff0c;学习期间基于复习之前知识点的需要&#xff0c;故撰写本教程&#xff0c;即是复习前面的知识点也是作为博客的补充 1.0 文件夹的创建 创建一个STM32项目为模版工程&#xff0c;问价夹下分别包含4个子文件夹&#xff0c;一个是Librar…...

JMH324-免费【最后一战LOL】MOBA竞技版本+单机一键端+视频教程+文本教程

资源介绍&#xff1a; 修改前打开【D:\ZHServer】文件夹里的【[1]一键启动.bat】&#xff0c;游戏不要打开&#xff0c;否则修改失败。 修改完以后重启架设程序才会生效。 fball_gamedb1数据库——gameuser数据表 obj_name 角色名 obj_lv 等级 obj_diamond 钻石 obj_gold 8…...

WPF UI 3D 多轴 机械臂 stl 模型UI交互

1、三维插件环境调整 2、动态模型材质处理 3、动态模型鼠标交互 4、模型旋转基本思路 5、六轴机械臂节点旋转处理 6、更多HelixToolkit插件处理案例 7、快速对接Blender模型 鼠标交互&#xff08;没有强调场景的变换&#xff09; 鼠标命中测试&#xff08;HitTest 不推荐&…...

《金山 WPS AI 2.0:重塑办公未来的智能引擎》

AITOP100平台获悉&#xff0c;在 2024 世界人工智能大会这一科技盛宴上&#xff0c;金山办公以其前瞻性的视野和创新的技术&#xff0c;正式发布了 WPS AI 2.0&#xff0c;犹如一颗璀璨的星辰&#xff0c;照亮了智能办公的新征程&#xff0c;同时首次公开的金山政务办公模型 1.…...

RT2-使用NLP的方式去训练机器人控制器

目标 研究在网络数据上训练的视觉语言模型也可以直接结合到端到端的机器人控制中&#xff0c;提升泛化性以及获得突出的语义推理&#xff1b;使得单个的端到端训练模型可以同时学习从机器人观测到动作的映射&#xff0c;这个过程可以受益于基于网络上的语言和视觉语言数据的预训…...

VisActor vs ECharts: 哪个更适合你的数据可视化需求?

VisActor vs ECharts: 哪个更适合你的数据可视化需求&#xff1f; 在当今数据驱动的世界里&#xff0c;选择合适的数据可视化工具是至关重要的。ECharts作为广受欢迎的可视化库&#xff0c;已经在行业内拥有了长久的历史和广泛的用户基础。然而&#xff0c;VisActor作为新兴的…...

【QT中实现摄像头播放、以及视频录制】

学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…...

el-table封装popver組件,点击列筛选行数据功能,支持筛选,搜索,排序功能

子组件&#xff1a; <template><div class"tableTool" ref"tableTool" click.stop><el-button click"shengFnc">升序</el-button><el-button click"jiangFnc">降序</el-button><el-input v-m…...

基于DPU的云原生计算资源共池管理解决方案

1. 方案背景和挑战 在传统的云环境中&#xff0c;通常存在着不同的技术栈&#xff0c;支撑多样化的计算服务&#xff0c;具体如下&#xff1a; ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目&#xff0c;它提供了部署和管理大规模计…...

Bugly并非无所不能

在 iOS 应用因为内存占用过大而被系统 killed 的情况下&#xff0c;Bugly 以及大多数崩溃报告工具是无法捕获到这种类型的崩溃信息的。原因在于&#xff0c;当系统由于内存压力过大而终止应用时&#xff0c;是直接将应用进程杀死&#xff0c;不会触发常规的崩溃处理流程&#x…...

2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)

51、探索各种选项&#xff0c;权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素&#xff0c;在整个过程中&#xff0c;舍弃无效或次优的替代方案&#xff0c;这种不确定性应对方法是()。 A&#xff0e;集合设计 B&#xff0e;坚韧性 C&#xff0e;多种结果…...

YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…...

高效前端开发:解密pnpm的存储与链接

什么是pnpm PNPM&#xff08;Performant NPM&#xff09;是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn&#xff0c;PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…...

设置单实例Apache HTTP服务器

配置仓库 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo仓库代码&#xff1a; [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0挂载 [rootlocalhost …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...