news 2026/7/3 11:37:18

文件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/25 17:52:50

物联网(IoT)测试攻防:面对海量异构设备,我们如何构筑质量防线?

IoT测试的“复杂性风暴”在万物互联的时代&#xff0c;物联网设备正以前所未有的速度渗透至工业、家居、医疗、交通等各个领域。据统计&#xff0c;2025年全球活跃IoT设备数量已突破300亿&#xff0c;且设备类型、通信协议、硬件平台、操作系统呈现高度碎片化特征。这种“海量”…

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

810-234640-213控制器模块

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

作者头像 李华
网站建设 2026/6/29 20:54:22

北京半口种牙要多少钱

北京半口种牙要多少钱&#xff1a;全面解析与费用指南在现代口腔医疗技术的不断进步下&#xff0c;种植牙已成为解决牙齿缺失问题的有效方法之一。尤其在北京这样的大城市&#xff0c;越来越多的人选择进行半口种植牙手术来恢复口腔健康和美观。然而&#xff0c;对于很多患者来…

作者头像 李华
网站建设 2026/6/25 20:51:35

斯坦福等顶级院校联合破解embodied AI密码

这项由斯坦福大学、帝国理工学院、伦敦国王学院等多所知名院校联合完成的研究发表于2024年12月&#xff0c;论文编号为arXiv:2512.11362v3。研究团队包括来自多个国际一流机构的学者&#xff0c;他们共同探索了一个令人兴奋的AI前沿领域——让机器人真正像人类一样思考和行动。…

作者头像 李华