news 2026/6/17 19:35:26

标准IO之文件打开与关闭

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
标准IO之文件打开与关闭

文章目录

  • 文件的打开
    • 打开函数
    • 打开模式
      • 文件IO和标准IO的模式对应关系
  • 文件的关闭
    • 关闭函数
  • 处理错误信息
    • errno错误码变量
    • perror()打印错误描述
    • strerror() 获取错误描述字符串
  • 文件的访问权限
    • 不受umask影响的方法
      • 方法1:使用chmod或fchmod立即修正
      • 方法2:先修改umask,创建文件后恢复

文件的打开

打开函数

  • 头文件:
    • #include <stdio.h>
  • 函数原型:
    • FILE *fopen (const char *path, const char *mode);
  • 参数:
    • path: 普通文件,当前路径不需要加目录,其他要使用完整的路径
    • mode:文件打开的模式
  • 返回值:
    • 成功时返回有关文件的FILE指针
    • 出错返回NULL
    • 所以使用fopen函数必须判断是否为空

打开模式

模式含义
r或rb以只读方式打开文件,文件必须存在
r+或r+b以读写方式打开文件,文件必须存在
w或wb以只写方式打开文件,若文件存在则文件长度清为0,若文件不存在则创建
w+或w+b以读写方式打开文件,若文件存在则文件长度清为0,若文件不存在则创建
a或ab以只写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾
a+或a+b以读写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾

文件IO和标准IO的模式对应关系

  • 标准IO中,存在的文件,第二个参数mode一般指定的是文件打开的模式。不存在的文件会创建,第二个mode默认会指定文件打开的模式和默认的文件打开的权限
    • FILE* fopen (const char *path, const char *mode);
  • 文件IO中,第二个参数flags指定的是文件打开的模式, 第三个参数mode指定新文件打开的权限
    • int open(const char *pathname, int flags, mode_t mode);
标准IO文件IO
rO_RDONLY
r+O_RDWR
wO_WRONLY
w+O_RDWR
aO_WRONLY
a+O_RDWR
#include<stdio.h>intmain(intargc,char*argv[]){FILE*fp=NULL;if((fp=fopen("test.txt","r"))==NULL){printf("fopen error\n");return-1;}printf("fopen success\n");fclose(fp);return0;}

文件的关闭

关闭函数

  • 头文件:
    • #include <stdio.h>
  • 函数原型:
    • int fclose(FILE *stream)
  • 参数:
    • stream文件的FILE指针,必须保证为非空
  • 返回值:
    • fclose()调用成功返回0,失败返回EOF(-1),并设置errno;
  • 流关闭时自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘;
  • 当一个程序正常终止时,所有打开的流都会被关闭,流一旦关闭后就就不能执行任何操作

处理错误信息

errno错误码变量

  • errno 全局变量,由系统生成,记录最近一次系统调用的错误码
  • 头文件:
    • #include <errno.h>
  • 函数原型:
    • extern int errno;
  • 初始值为0:表示没有错误

perror()打印错误描述

  • 根据errno值,输出对应的错误描述
  • perror先输出字符串s,再输出错误号对应的错误信息
  • 头文件:
    • #include <stdio.h>
  • 函数原型:
    • void perror(const char *s);
  • 参数s是自定义前缀信息

strerror() 获取错误描述字符串

  • strerror根据错误号返回对应的错误信息
  • 不会自动使用当前errno,需要显式传入
  • 头文件:
    • #include <string.h>
  • 函数原型:
    • char *strerror(int errno);
  • printf("Error: %s\n", strerror(errno));
#include<stdio.h>#include<unistd.h>#include<errno.h>#include<string.h>externinterrno;intmain(intargc,constchar*argv[]){FILE*fp=NULL;#if0if((fp=fopen("test.txt","r"))==NULL){printf("errno:%d\n",errno);perror("fopen:");return-1;}#elseif((fp=fopen("test.txt","r"))==NULL){printf("errno:%d\n",errno);printf("fopen:%s\n",strerror(errno));return-1;}#endifprintf("errno:%d\n",errno);perror("perror:");sleep(3);fclose(fp);return0;}

文件的访问权限

  • 文件打开的模式 和 文件访问的权限是两个不同的概念
  • 文件打开的模式fopen函数的对文件的打开操作,文件访问的权限是文件的属性。fopen() 默认创建的文件访问权限是0666(rw-rw-rw-)
  • 是8进制的形式,分别依次对应三组对文件的权限,当前用户的,当前用户所在组的,当前用户所在组其他用户,4 可读 2 可写 1 可执行,也可以用字母r w x表示,-表示没有任何权限
  • Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & ~umask),Root用户的umask是 022, 普通用户的umask是002,用户可以通过umask函数或者命令修改相关设定

不受umask影响的方法

方法1:使用chmod或fchmod立即修正

#include<sys/stat.h>#include<fcntl.h>intmain(){// 创建文件intfd=open("myfile.txt",O_CREAT|O_WRONLY,0666);if(fd==-1){perror("open");return1;}// 立即设置权限(忽略umask)if(fchmod(fd,0666)==-1){perror("fchmod");}close(fd);return0;}

方法2:先修改umask,创建文件后恢复

#include<sys/stat.h>#include<sys/types.h>intmain(){mode_told_mask=umask(0);// 临时设置umask为0// 现在创建文件不受umask影响intfd=open("myfile.txt",O_CREAT|O_WRONLY,0666);umask(old_mask);// 恢复原来的umaskclose(fd);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:26:12

什么是无代码平台?它能为企业解决什么问题?

在数字化转型的浪潮中&#xff0c;企业对高效管理工具的需求日益迫切。然而&#xff0c;传统软件开发模式的高成本、长周期、强技术依赖等痛点&#xff0c;让众多中小企业望而却步。近年来&#xff0c;无代码平台的崛起打破了这一僵局&#xff0c;它以“低门槛、高灵活、低成本…

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

2025年暨南大学计算机考研复试机试真题(附 AC 代码 + 解题思路)

2025年暨南大学计算机考研复试机试真题 2025年暨南大学计算机考研复试上机真题 历年暨南大学计算机考研复试上机真题 历年暨南大学计算机考研复试机试真题 更多学校题目开源地址&#xff1a;https://gitcode.com/verticallimit1/noobdream N 诺 DreamJudge 题库&#xff1…

作者头像 李华
网站建设 2026/6/16 19:11:06

2025年西北大学计算机考研复试机试真题(附 AC 代码 + 解题思路)

2025年西北大学计算机考研复试机试真题 2025年西北大学计算机考研复试上机真题 历年西北大学计算机考研复试上机真题 历年西北大学计算机考研复试机试真题 更多学校题目开源地址&#xff1a;https://gitcode.com/verticallimit1/noobdream N 诺 DreamJudge 题库&#xff1…

作者头像 李华
网站建设 2026/6/8 23:24:42

微信小程序uniapp-vue自驾游资助定制游旅游线路景点评论系统

文章目录具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万…

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

2025最新!专科生必看9大AI论文平台测评与推荐

2025最新&#xff01;专科生必看9大AI论文平台测评与推荐 2025年专科生必备的AI论文平台测评指南 随着人工智能技术在教育领域的广泛应用&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率与质量。然而&#xff0c;面对市场上琳琅满目的AI论文平台&#xff0c;如何…

作者头像 李华
网站建设 2026/6/14 7:22:38

学长亲荐8个AI论文工具,研究生轻松搞定开题报告!

学长亲荐8个AI论文工具&#xff0c;研究生轻松搞定开题报告&#xff01; AI工具让论文写作不再“卡壳” 在研究生阶段&#xff0c;论文写作是每位学生必须面对的挑战。无论是开题报告、文献综述还是最终的毕业论文&#xff0c;都需要大量的时间与精力。而随着AI技术的发展&…

作者头像 李华