news 2026/6/15 18:07:17

文件IO操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文件IO操作

文章目录

  • 文件描述符
  • 文件打开与关闭
    • 文件打开
    • 文件关闭
  • 文件读写
    • 文件读
    • 文件写
  • 定位文件
  • 修改访问权限
  • 一般指的是封装了系统调用实现的应用编程接口函数,与硬件有强耦合关系(每次调用必定会引起系统调用)

文件描述符

  • fd(file descriptor)
  • Linux为程序中每个打开的文件分配、对应一个文件描述符
  • 文件描述符是一个非负整数,从0开始分配,依次递增(在Linux操作系统中默认一个进程可以打开的数量是1024,是0-1023的数字,非固定,可以修改扩增)
  • 文件IO操作通过文件描述符来完成
    • 规定:0为标准输入,1为标准输出,2为标准出错

文件打开与关闭

文件打开

  • open函数用来创建或打开一个文件
  • 头文件:
    • #include <sys/types.h>
    • #include <sys/stat.h>
    • #include <fcntl.h>
  • 函数原型:
    • int open(const char *pathname, int flags);
    • int open(const char *pathname, int flags, mode_t mode);
  • 返回值:成功时返回文件描述符,出错时返回EOF
  • 参数:
    • pathname文件名
    • flag打开文件的读写方式
    • mode打开文件时不存在,创建新文件时指定该文件的存取权限
  • 注意事项:
    • open函数打开文件时使用两个参数,但不能创建文件
    • open函数创建文件时使用第三个参数,用来指定新文件的存取权限(只有在建立新文件时有效)。此外真正建文件时的存取权限会受到umask值影响,实际存取权限是mode-umaks
    • 可以打开设备文件,但是不能创建设备文件

  • mode参数(文件打开的存取权限):
    • 三组对文件的权限,当前用户的,当前用户所在组的,当前用户所在组其他用户的
    • 4 r 可读,2 w 可写,1 x 可执行
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<unistd.h>intmain(intargc,constchar*argv[]){intfd=-1;if((fd=open("4.txt",O_CREAT|O_RDONLY|O_EXCL,0664))<0){printf("open error!\n");return-1;}printf("open success!\n");if(!close(fd)){printf("close success!\n");}return0;}
  • umask设定权限
    • umask概念:用来设置作为默认文件或目录的初始权限的掩码
    • 例如执行umask 002 ,则之后新创建的文件是664权限,新创建的目录是775权限

666 - 002 777 - 002

666 110 110 110 ^ 002 000 000 010 _______________________ 664 110 110 100
  • ulimit -n可以查看打开的文件数量

  • ulimit -a当前系统可以操作的资源限制值情况

文件关闭

  • close函数用来关闭打开的一个文件
  • 头文件:
    • #include <unistd.h>
  • 函数原型:
    • int close(int fd);
  • 返回值:
    • 正常返回0,失败返回-1
  • 参数:
    • fd指定要关闭的文件,关闭后文件描述符不能代表文件
if(!close(fd)){printf("close success!\n");}

文件读写

文件读

  • read 函数用来从文件中读取数据
  • 头文件:
    • #include <unistd.h>
  • 函数原型:
    • ssize_t read(int fd, void *buf, size_t count);
  • 返回值:
    • 成功时返回实际读取的字节数
    • 出错时返回EOF(-1)
    • 注意读到文件末尾时返回0
  • 参数:
    • buf是接收数据的缓冲区
    • count不应超过buf大小
  • 例程:从指定的文件(文本文件)中读取内容并统计大小
#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#defineN20intmain(intargc,char*argv[]){intfd=-1,n=0,total=0;charbuf[20]={0};if(argc<2){printf("Usage : %s <file>\n",argv[0]);return-1;}//文件必须存在if((fd=open(argv[1],O_RDWR))==EOF){printf("open error\n");return-1;}printf("open success\n");while((n=read(fd,buf,N))>0){printf("%s",buf);total+=n;}printf("Read characters: %d\n",total);printf("Finished reading\n");close(fd);return0;}

文件写

  • write 函数用来向文件写入数据
  • 头文件:
    • #include <unistd.h>
  • 函数原型:
    • ssize_t write(int fd, void *buf, size_t count);
  • 返回值:
    • 成功时返回实际写入的字节数
    • 出错时返回EOF
  • 参数:
    • buf是发送数据的缓冲区
    • count不应超过buf大小
  • 例程:将键盘输入的内容写入文件,直到输入quit
#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#defineN20intmain(intargc,char*argv[]){intfd=-1,n=0;charbuf1[N]={0};charbuf2[N]="hello world";if(argc<2){printf("Usage : %s <file>\n",argv[0]);return-1;}//文件必须存在if((fd=open(argv[1],O_RDWR))==EOF){printf("open error\n");return-1;}printf("open success\n");if((n=read(fd,buf1,N))<0){printf("Read error\n");return-1;}printf("Read characters: %s",buf1);printf("Finished reading\n");do{n=write(fd,buf2,strlen(buf2));}while(n<0);printf("Write characters: %d\n",n);printf("Finished writing\n");close(fd);return0;}

定位文件

  • lseek函数用来定位文件
  • 头文件:
    • #include <unistd.h>
  • 函数原型:
    • off_t lseek(int fd, off_t offset, int whence);
  • 返回值:
    • 成功时返回当前的文件读写位置
    • 出错时返回EOF
  • 参数:
    • offset 表示偏移量字节数值
    • whence 的选项:
      • SEEK_SET:文件偏移量设置为文件开始加上偏移量(offset)字节
      • SEEK_CUR:文件偏移量设置为其当前位置加上偏移量(offset)字节,意思是先定位到当前的读写指针处,再开始往后计算
      • SEEK_END:文件偏移量设置为文件大小加偏移量(offset)字节,意思是先定位到末尾再开始往后计算
  • 常用使用示例:
    • 将读写位置移到文件开头:lseek(int fildes, 0, SEEK_SET);
    • 将读写位置移到文件尾:lseek(int fildes, 0, SEEK_END);
    • 获取当前文件位置:off_t ret = lseek(int fildes, 0, SEEK_CUR);
#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#defineN20intmain(intargc,char*argv[]){intfd=-1;intret=0;charbuf[N]={0};if(argc<2){printf("Usage : %s <file>\n",argv[0]);return-1;}//文件不存在if((fd=open(argv[1],O_RDWR|O_CREAT,0664))==EOF){printf("open error\n");return-1;}printf("open success\n");ret=lseek(fd,0,SEEK_CUR);printf("%u\n",ret);read(fd,buf,10);printf("%s",buf);ret=lseek(fd,0,SEEK_CUR);printf("%u\n",ret);lseek(fd,0,SEEK_END);write(fd,"aaa",strlen("aaa"));ret=lseek(fd,0,SEEK_CUR);printf("%u\n",ret);ret=lseek(fd,0,SEEK_SET);printf("%u\n",ret);bzero(buf,sizeof(buf));while(read(fd,buf,sizeof(buf))>0){printf("%s",buf);bzero(buf,sizeof(buf));}printf("Read end\n");close(fd);return0;}

修改访问权限

  • chmod/fchmod函数用来修改文件的访问权限
    • #include <sys/stat.h>
    • int chmod(const char *path, mode_t mode);
    • int fchmod(int fd, mode_t mode);
    • 成功时返回0;出错时返回EOF
  • root和文件所有者能修改文件的访问权限
  • 示例: chmod(“test.txt”, 0666);
#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#defineN20intmain(intargc,char*argv[]){intfd=-1,n=0,total=0;charbuf[20]={0};if(argc<2){printf("Usage : %s <file>\n",argv[0]);return-1;}if(chmod(argv[1],0200)<0){printf("chmod file error\n");return-1;}//文件必须存在if((fd=open(argv[1],O_RDWR))==EOF){printf("open error\n");return-1;}printf("open success\n");while((n=read(fd,buf,N))>0){printf("%s",buf);total+=n;}printf("Read characters: %d\n",total);printf("Finished reading\n");close(fd);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:26:47

Open-AutoGLM全面指南(从入门到高阶实战)

第一章&#xff1a;Open-AutoGLM全面指南&#xff08;从入门到高阶实战&#xff09;Open-AutoGLM 是一个开源的自动化通用语言模型集成框架&#xff0c;专为开发者和研究人员设计&#xff0c;支持快速构建、训练与部署多模态语言模型。该框架融合了自动机器学习&#xff08;Aut…

作者头像 李华
网站建设 2026/6/15 12:40:55

揭秘智谱Open-AutoGLM黑科技:如何用自然语言指令远程控制你的手机?

第一章&#xff1a;智谱Open-AutoGLM手机控制技术概述 智谱AI推出的Open-AutoGLM是一项面向移动端的智能自动化控制技术&#xff0c;旨在通过大语言模型驱动手机操作系统完成复杂任务。该技术结合自然语言理解与设备操作能力&#xff0c;实现从语音指令到具体UI交互的端到端执行…

作者头像 李华
网站建设 2026/6/15 10:00:17

玩转Playwright:一套代码搞定Web、移动端、API自动化测试

测试工程师的效率困境与统一化需求在现代快速迭代的软件开发周期中&#xff0c;测试工程师常常面临多重挑战&#xff1a;Web应用、移动端&#xff08;尤其移动端浏览器&#xff09;以及后端API的测试往往需要不同的工具链&#xff08;如Selenium、Appium、Postman/Requests&…

作者头像 李华
网站建设 2026/6/15 9:59:52

24428-XA11-BJM真空角阀

24428-XA11-BJM 真空角阀产品应用领域&#xff1a;半导体制造&#xff1a;气体输送、刻蚀及沉积工艺控制实验室真空系统&#xff1a;真空泵连接、气体抽吸与排放制药与生物工程&#xff1a;冻干、浓缩及无菌气体控制食品加工&#xff1a;真空包装、脱气与干燥工艺化工行业&…

作者头像 李华
网站建设 2026/6/15 10:00:17

02-17786-000电源模块

02-17786-000 电源模块产品应用领域&#xff1a;工业自动化设备&#xff1a;PLC、控制器及传感器供电通信系统&#xff1a;基站、路由器及交换设备电源管理轨道交通&#xff1a;信号系统及控制设备电源保障航空航天&#xff1a;地面设备及测试系统供电电力系统&#xff1a;继电…

作者头像 李华
网站建设 2026/6/15 9:59:59

23,463张无人机和卫星图像高质量标注,覆盖20个类别包括港口船舶车辆飞机,支持YOLO和VOC格式,专为深度学习目标检测算法优化,训练集验证集均衡划分提升模型鲁棒性,填补小目标检测数据空白

23,463张无人机和卫星图像高质量标注&#xff0c;覆盖20个类别包括港口船舶车辆飞机&#xff0c;支持YOLO和VOC格式&#xff0c;专为深度学习目标检测算法优化&#xff0c;训练集验证集均衡划分提升模型鲁棒性&#xff0c;填补小目标检测数据空白 引言与背景 在遥感图像分析领…

作者头像 李华