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就是系统调用,用户空间进入内核空间…...
LeetCode67(二进制求和[位运算,大数运算])
二进制求和 题目要求: 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 这道题其实有几种解法.我们先来介绍简单的方法. 我们可以将两个字符串的二进制转成十进制,获取对应值相加之后,我们可以不断对2取余,获取尾数拼接即可.也就是像我们平常求一…...
grep对文件内容搜索(附重要拓展-正则表达式)
文件搜索是搜索查找符合条件的某文件的目录,若要编辑文件或对文件的某配置进行修改,就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具,用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…...
前端JS特效第26波:jQuery日期时间选择器插件
jQuery日期时间选择器插件,先来看看效果: 部分核心的代码如下: <!DOCTYPE html> <html> <head lang"zh-CN"> <meta charset"UTF-8"> <title>jQuery日期时间选择器插件 - PHP中文网</t…...
Anaconda+Pycharm 项目运行保姆级教程(附带视频)
最近很多小白在问如何用anacondapycharm运行一个深度学习项目,进行代码复现呢?于是写下这篇文章希望能浅浅起到一个指导作用。 附视频讲解地址:AnacondaPycharm项目运行实例_哔哩哔哩_bilibili 一、项目运行前的准备(软件安装&…...
java面试-java基础(上)
文章目录 一、什么是Java?特点?二、什么是JVM、JDK、JRE?三、java跨平台实现原理四、java数据类型有哪些?五、char能不能存一个中文汉字?六、存在数字i加1小于i或者i减1小于i?七、什么是自动类型转换与强制类型转换?八、什么是装/拆箱&am…...
STM32快速搭建项目框架
注:编写本博客的原因,学习期间基于复习之前知识点的需要,故撰写本教程,即是复习前面的知识点也是作为博客的补充 1.0 文件夹的创建 创建一个STM32项目为模版工程,问价夹下分别包含4个子文件夹,一个是Librar…...
JMH324-免费【最后一战LOL】MOBA竞技版本+单机一键端+视频教程+文本教程
资源介绍: 修改前打开【D:\ZHServer】文件夹里的【[1]一键启动.bat】,游戏不要打开,否则修改失败。 修改完以后重启架设程序才会生效。 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模型 鼠标交互(没有强调场景的变换) 鼠标命中测试(HitTest 不推荐&…...
《金山 WPS AI 2.0:重塑办公未来的智能引擎》
AITOP100平台获悉,在 2024 世界人工智能大会这一科技盛宴上,金山办公以其前瞻性的视野和创新的技术,正式发布了 WPS AI 2.0,犹如一颗璀璨的星辰,照亮了智能办公的新征程,同时首次公开的金山政务办公模型 1.…...
RT2-使用NLP的方式去训练机器人控制器
目标 研究在网络数据上训练的视觉语言模型也可以直接结合到端到端的机器人控制中,提升泛化性以及获得突出的语义推理;使得单个的端到端训练模型可以同时学习从机器人观测到动作的映射,这个过程可以受益于基于网络上的语言和视觉语言数据的预训…...
VisActor vs ECharts: 哪个更适合你的数据可视化需求?
VisActor vs ECharts: 哪个更适合你的数据可视化需求? 在当今数据驱动的世界里,选择合适的数据可视化工具是至关重要的。ECharts作为广受欢迎的可视化库,已经在行业内拥有了长久的历史和广泛的用户基础。然而,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組件,点击列筛选行数据功能,支持筛选,搜索,排序功能
子组件: <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. 方案背景和挑战 在传统的云环境中,通常存在着不同的技术栈,支撑多样化的计算服务,具体如下: ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目,它提供了部署和管理大规模计…...
Bugly并非无所不能
在 iOS 应用因为内存占用过大而被系统 killed 的情况下,Bugly 以及大多数崩溃报告工具是无法捕获到这种类型的崩溃信息的。原因在于,当系统由于内存压力过大而终止应用时,是直接将应用进程杀死,不会触发常规的崩溃处理流程&#x…...
2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)
51、探索各种选项,权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素,在整个过程中,舍弃无效或次优的替代方案,这种不确定性应对方法是()。 A.集合设计 B.坚韧性 C.多种结果…...
YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…...
高效前端开发:解密pnpm的存储与链接
什么是pnpm PNPM(Performant NPM)是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn,PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…...
设置单实例Apache HTTP服务器
配置仓库 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo仓库代码: [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0挂载 [rootlocalhost …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
