news 2026/4/23 10:28:37

标准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/4/19 12:01:09

力扣hot100 - 21、合并两个有序链表

题目&#xff1a;思路一&#xff1a;迭代 整体思路&#xff1a;如上例所示&#xff0c;当 l1 和 l2 都不是空链表时&#xff0c;判断 l1 和 l2 哪一个链表的头节点的值更小&#xff0c;将较小值的节点添加到结果里&#xff0c;当一个节点被添加到结果里之后&#xff0c;将对应链…

作者头像 李华
网站建设 2026/4/18 2:33:15

基于STM32的智能鱼缸控制系统设计与实现

基于STM32的智能鱼缸控制系统设计与实现 摘要 本文设计并实现了一种基于STM32F103C8T6微控制器的智能鱼缸控制系统&#xff0c;通过多传感器融合与智能控制策略&#xff0c;实现了对鱼缸环境参数的精准监测与自动化管理。系统采用DS18B20防水温度传感器实现0.5℃精度的水温监…

作者头像 李华
网站建设 2026/4/19 8:19:18

方达炬 发明一批指标

方达炬 发明一批指标&#xff1a;【工业制造指标】 工业制造能力汇价 生产量交割量对率 远期市场机会规模【内政安全指标】 经济定价对调整利率求差 生活日对财务通信日求差 预算案指标日对预算周期日求差【预算案指标】 生活用紧急流动性拨备 竞争用紧急流动性拨备 战争用紧…

作者头像 李华
网站建设 2026/4/22 4:08:18

ubuntu22.04安装中文输入法且与ros2与clion不冲突

ubuntu22.04安装中文输入法且与ros2与clion不冲突安装中文输入法&#xff1a;在 Ubuntu 22.04 上&#xff0c;要做到 中文输入法稳定可用&#xff0c;同时 不与 ROS 2、CLion&#xff08;JetBrains 系&#xff09;冲突&#xff1a;✅ 唯一强烈推荐方案&#xff1a;Fcitx5 拼音…

作者头像 李华
网站建设 2026/4/18 11:57:40

微信小程序uniapp-vue音乐播放器

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

作者头像 李华
网站建设 2026/4/22 16:21:45

基于SpringBoot的供应链管理系统的设计与实现(毕业设计项目源码+文档)

课题摘要本课题以 SpringBoot 框架为核心技术底座&#xff0c;研发一套适配中小制造企业与商贸企业的全流程供应链管理系统&#xff0c;旨在解决传统供应链运营中采购、仓储、物流、销售环节数据割裂、供需匹配失衡、库存周转效率低、订单履约追踪难等痛点&#xff0c;打造集采…

作者头像 李华