news 2026/4/3 22:47: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/4/3 4:42:58

从UI到契约:API契约测试如何成为微服务质量的“定海神针”?

微服务测试的演进与挑战‌在单体应用时代&#xff0c;测试焦点多集中于用户界面&#xff08;UI&#xff09;和数据库层&#xff0c;UI测试作为验收标准&#xff0c;模拟用户操作以验证系统功能。然而&#xff0c;微服务架构将应用拆分为数十甚至数百个独立服务&#xff0c;各服…

作者头像 李华
网站建设 2026/3/31 7:36:57

GLM-4.7 MiniMax M2.1 实测上线:来AI Ping 免费用两款最强模型!

引言&#xff1a;从“单次生成”走向“工程交付与长期运行” 大模型的对比&#xff0c;过去常停留在单轮回答的流畅度与知识覆盖面&#xff1b;而在真实工程里&#xff0c;更关键的是两件事&#xff1a; 复杂任务能不能一次交付&#xff1a;需求拆解、修改迭代、工具调用、依…

作者头像 李华
网站建设 2026/3/13 22:47:40

19A1078502-01控制器模块

19A1078502-01 控制器模块产品应用领域&#xff1a;工业自动化&#xff1a;生产线设备控制与数据采集电力系统&#xff1a;开关、继电器、监控和保护信号管理石化与化工&#xff1a;反应釜、泵阀及管道自动化控制制药行业&#xff1a;生产设备自动化控制与监测食品加工&#xf…

作者头像 李华
网站建设 2026/3/26 6:53:18

0190-70725控制器

0190-70725 控制器产品应用领域&#xff1a;工业自动化&#xff1a;生产线设备控制与数据采集电力系统&#xff1a;开关、继电器及监控信号管理石化与化工&#xff1a;泵阀控制、反应釜及管道自动化制药行业&#xff1a;生产设备自动化控制与过程监测食品加工&#xff1a;包装、…

作者头像 李华
网站建设 2026/3/31 0:58:33

后端开发者如何转型AI应用:大模型时代的职业机遇与学习指南

文章提出AI金字塔模型&#xff0c;指出应用级开发者在AI原生应用层面临最大机遇。传统开发者应关注RAG和Agent技术&#xff0c;了解模型原理并结合行业场景。AI淘汰的不是人&#xff0c;而是不会使用AI的人&#xff0c;转型需掌握基础知识、开发工具、实践项目和领域知识。文末…

作者头像 李华
网站建设 2026/4/1 9:15:44

MaxCompute与hadoop+hive+调度器yarn区别

好的&#xff0c;我们来详细比较一下 MaxCompute 与 Hadoop Hive YARN 这套组合的区别。这两者都是处理大规模数据集&#xff08;大数据&#xff09;的解决方案&#xff0c;但它们在架构、使用方式和适用场景上存在显著差异。1. 定位与架构MaxCompute (原名 ODPS):定位: 是一…

作者头像 李华