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/9 22:49:33

【独家解析】Open-AutoGLM架构设计内幕:Web交互背后的工程智慧

第一章&#xff1a;Open-AutoGLM Web交互全景概览 Open-AutoGLM 是一个面向自动化代码生成与自然语言任务处理的开源Web平台&#xff0c;融合了大语言模型&#xff08;LLM&#xff09;推理能力与图形化操作界面。用户可通过浏览器直接与模型交互&#xff0c;完成从代码生成、脚…

作者头像 李华
网站建设 2026/6/9 22:37:57

C++课后习题训练记录Day56

1.练习项目&#xff1a; 题目描述 蓝桥王国的每个快递都包含两个参数&#xff1a;1.快递单号 2.快递城市。 小李是蓝桥王国的一名快递员&#xff0c;每天的快递分拣让他苦不堪言。 于是他想要你帮他设计一个程序用于快递的分拣&#xff08;将不同快递按城市信息分开&#x…

作者头像 李华
网站建设 2026/6/6 3:23:05

学者团队实现摄像头“看见”雷达技术突破

在自动驾驶汽车的世界里&#xff0c;有一场看不见的战争正在悄悄进行着。摄像头能够捕捉丰富的视觉细节&#xff0c;就像人眼一样看到红绿灯、行人和路标&#xff0c;但在雨雾天气中却容易"失明"。雷达则完全相反&#xff0c;它能在任何恶劣天气中稳定工作&#xff0…

作者头像 李华
网站建设 2026/6/6 6:18:30

Open-AutoGLM官方地址变更全解析(2024最全汇总+备用链接)

第一章&#xff1a;Open-AutoGLM地址变更背景与影响近期&#xff0c;Open-AutoGLM 项目的官方代码仓库与文档中心完成了地址迁移&#xff0c;这一变更是为了适应项目治理结构的升级以及提升全球开发者的访问效率。新地址统一整合了多个分散的子项目入口&#xff0c;实现了资源集…

作者头像 李华
网站建设 2026/5/29 12:52:47

Open-AutoGLM性能优化秘籍:让Java服务响应速度提升5倍

第一章&#xff1a;Open-AutoGLM性能优化秘籍&#xff1a;让Java服务响应速度提升5倍在高并发场景下&#xff0c;Java服务的响应延迟常常成为系统瓶颈。Open-AutoGLM作为新一代轻量级模型推理框架&#xff0c;通过深度整合JVM底层机制与智能缓存策略&#xff0c;显著提升了服务…

作者头像 李华
网站建设 2026/6/8 16:52:03

AI智能体技术落地现状深度解析:程序员学习大模型的实用指南

LangChain 2025年Q4调查显示&#xff0c;57.3%组织已将AI智能体部署至生产环境&#xff0c;大型企业(67%)领先。客服(26.5%)和研究分析(24.4%)是主要应用场景&#xff0c;质量(32.9%)和延迟(20.1%)是最大障碍。多模型使用已成常态(75%)&#xff0c;OpenAI GPT占主导(67.8%)&…

作者头像 李华