news 2026/5/1 10:55:50

标准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/5/1 4:02:47

adb卸载手机app

一、下载adb Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip Linux版本&#xff1a;https://dl.google.com/android/r…

作者头像 李华
网站建设 2026/5/1 4:06:16

基于STM32的智能花盆系统设计与实现

基于STM32的智能花盆系统设计与实现 摘要 本文设计并实现了一种基于STM32F407VET6微控制器的智能花盆系统&#xff0c;通过多传感器融合与智能控制策略&#xff0c;实现了对植物生长环境的全方位监测与精准调控。系统集成DS18B20温度传感器、土壤湿度传感器、光敏电阻、雨滴传…

作者头像 李华
网站建设 2026/5/1 4:06:56

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

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

作者头像 李华
网站建设 2026/5/1 4:01:59

leetcode热题岛屿数量

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&#xff0c;你可以假设该网格的四条边均被…

作者头像 李华
网站建设 2026/5/1 4:06:57

【图像处理基石】什么是神经渲染?

前言 在计算机图形学和计算机视觉的交叉领域&#xff0c;神经渲染&#xff08;Neural Rendering&#xff09;正成为最热门的研究方向之一。它打破了传统渲染依赖手工设计规则的局限&#xff0c;用神经网络学习从数据到图像的映射&#xff0c;让“AI画画”“数字人重建”“场景生…

作者头像 李华
网站建设 2026/4/30 12:46:16

性能测试中关于硬件环境的测试

比如营销活动的服务器的部署规格&#xff1a; 部署规格 CPU&#xff1a;0.001~4 (Core) 内存&#xff1a;16384~16384(Mb) 6个POD测试要点&#xff1a;单个pod的性能指标摸底&#xff0c;6Pod 集群峰值容量测试&#xff0c;6Pod 集群 72 小时稳定性测试&#xff0c;6Pod 集群容…

作者头像 李华