news 2026/6/9 22:51:55

文件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/10 10:54:43

Selenium过时了?2025年Web自动化测试框架选型深度对比

变革中的Web自动化测试版图‌回望过去几年&#xff0c;Web自动化测试工具生态经历了从“单一霸主”到“群雄并起”的剧烈演变。Selenium WebDriver以其开放协议&#xff08;W3C WebDriver&#xff09;和跨语言支持&#xff0c;奠定了现代Web自动化的基石。然而&#xff0c;其需…

作者头像 李华
网站建设 2026/6/10 11:43:04

60dB 超强回音消除!F-23 双麦阵列模块,重塑全场景清晰通话体验

在智能通话设备日益普及的今天&#xff0c;回音干扰、环境噪音嘈杂、集成适配复杂等问题&#xff0c;成为制约音频交互体验的核心痛点。无论是智能家居对讲、车载通话&#xff0c;还是安防监控、远程会议&#xff0c;用户都迫切需要一款能快速集成、性能稳定的语音处理解决方案…

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

斯坦福大学团队突破性发现:AI智能体终于学会了如何聪明探索!

在人工智能的世界里&#xff0c;有一个令人困惑的现象&#xff1a;我们已经能让大型语言模型像人类一样对话&#xff0c;甚至解决复杂的数学问题&#xff0c;但当它们需要在陌生环境中主动探索学习时&#xff0c;却常常表现得像迷路的孩子一样&#xff0c;要么过于谨慎不敢尝试…

作者头像 李华
网站建设 2026/6/10 12:33:06

CnOpenData 管理层薪酬统计表

据《上市公司信息披露管理办法》&#xff0c;上市公司作为信息披露义务人&#xff0c;应真实、准确、及时、完整地向市场公开依法及自愿披露的信息。这些公开披露的信息包含但不仅限于公司基本情况、主要会计数据和财务指标、股东持股情况、高管薪酬情况等。上市公司信息披露是…

作者头像 李华
网站建设 2026/6/10 0:28:36

大模型微调实战:基于LLaMA Factory的完整学习指南

这是一份LLaMA Factory大模型微调的完整教程&#xff0c;包含36个章节&#xff0c;从基础理论到实战部署的全流程。教程以Web安全领域专家模型微调为例&#xff0c;详细讲解数据集准备、参数调整、训练过程观察和模型部署等关键环节&#xff0c;帮助读者系统掌握大模型微调技能…

作者头像 李华
网站建设 2026/6/10 12:09:28

揭秘Open-AutoGLM底层架构:5步实现高效模型自动构建

第一章&#xff1a;揭秘Open-AutoGLM底层架构&#xff1a;5步实现高效模型自动构建Open-AutoGLM 是一个面向通用语言模型自动构建的开源框架&#xff0c;其核心设计理念是通过模块化解耦与流程自动化&#xff0c;降低大模型训练与部署的技术门槛。该架构通过五步流程实现从原始…

作者头像 李华