news 2026/3/10 6:12:49

标准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/3/8 0:26:43

可持续发展目标对公司估值的长期影响

可持续发展目标对公司估值的长期影响 关键词:可持续发展目标、公司估值、长期影响、环境社会治理、财务绩效 摘要:本文深入探讨了可持续发展目标(SDGs)对公司估值的长期影响。首先介绍了研究的背景、目的、预期读者、文档结构和相关术语。接着阐述了可持续发展目标与公司估…

作者头像 李华
网站建设 2026/3/7 3:52:39

ubuntu虚拟机mysql数据库忘记密码

ubuntu虚拟机mysql数据库忘记密码 ​ 上课时候&#xff0c;由于ubuntu虚拟机中的mysql数据库安装时是随机密码&#xff0c;导致pycharm连接时密码错误&#xff0c;以下是作者的解决办法。 文章目录ubuntu虚拟机mysql数据库忘记密码mysql安装以及spark中mysql依赖安装步骤 1&am…

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

PCIe-Tag Rule(2)

1. Tag字段的双重用途 在PCIe协议中,Tag字段实际上有两种完全不同的用途: TLP类型 TH字段 Tag[7:0]用途 说明 Non-Posted请求 任意 Tag标识符 用于标识未完成事务 Posted请求 0 未定义 可以是任意值,接收方必须忽略 Posted请求 1 ST[7:0] Steering Tag,影响请求处理方式 2…

作者头像 李华
网站建设 2026/3/7 9:32:47

光线折射的代码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>光的折射控制器</title><style>body…

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

不会 Prompt 的职场人,只是在浪费 AI

AI 已经跑进了绝大多数人的工作&#xff1a;写周报、做方案、查资料、写邮件&#xff0c;甚至连面试题都能让 AI 帮忙设计。 但一个很尴尬的现实是——同样一台模型&#xff0c;有的人能用它把工作效率翻倍&#xff0c;有的人只会打一句&#xff1a;“帮我写个方案”&#xff0…

作者头像 李华
网站建设 2026/3/7 9:22:16

无人配送车总遇导航难题,这款组合导航统统帮你解决

无人配送车户外作业&#xff0c;怕信号遮挡&#xff0c;怕环境不耐受&#xff0c;怕精度不够&#xff0c;更怕成本太高&#xff0c;低成本组合导航ER-GNSS/MINS-05统统帮你解决。厘米级定位信号续航&#xff0c;复杂场景也能精准导航无人车配送常行驶在楼宇密集&#xff0c;树木…

作者头像 李华