一分钟让你学会文件的打开与关闭函数

news2024/11/29 6:30:03

文章目录

  • 前言
  • 文件打开函数-fopen
      • 函数介绍
      • 文件的打开形式
      • 相对路径与绝对路径
  • 文件关闭函数-fclose
  • 文件操作正确流程

前言

我们已经了解了文件基本概念,那么我们如何通过代码对某一个文件进行一些文件操作呢?比如如何打开文件、关闭文件以及如何向文件中写入或是读取数据呢?

在头文件stdio.h中包含了一系列的文件操作函数,以便我们对特定的文件进行相应的操作。学会对文件进行操作后,我们就可以将代码与文件联系起来,这样能让编程变得更有意思不是吗?比如你可以用代码写一个游戏,当游戏结束后可以将游戏当前的数据保存到一个文件中,那么当你下一次运行代码时只要先读取该文件中的数据,就可以接着上一次的游戏进度继续玩,而不至于从头再来。

下面介绍了打开以及关闭文件的操作函数,以及其中的一些细节。

文件打开函数-fopen

函数介绍

FILE *fopen( const char *filename, const char *mode );

该函数的功能就是打开一个文件,函数的第一个参数是你要打开的文件的文件名,第二个参数是打开这个文件的形式。

我们知道打开一个文件时,系统会为该文件创建一个文件信息区,该函数调用完毕后,如果打开该文件成功,那么返回指向该文件信息区的指针(FILE*类型);如果打开文件失败,那么返回一个空指针(NULL)。

文件的打开形式

一、规则

在这里插入图片描述

使用上面的模式说明符,文件将作为文本文件打开

为了将文件作为二进制文件打开,模式字符串中必须包含“b”字符。这个附加的“b”字符可以附加在字符串的末尾(从而形成以下复合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),也可以插入在“+”符号之前(“rb+”、“wb+”、“ab+”)。

如果序列后面有其他字符,则行为取决于库实现:一些实现可能会忽略其他字符,例如,接受额外的“t”(有时用于显式表示文本文件)。

在某些库实现中,使用更新模式打开或创建文本文件可能会视为二进制文件。

举个几个例子:

1.若我们要以文本形式打开一个名叫data.txt的文件,将要对其进行输入操作,那么打开文件时应该这样写:

FILE* pf = fopen("data.txt", "r");

注:data.txt文件必须存在,不然打开文件失败,fopen函数会返回一个空指针。

2.若我们要以二进制打开一个名叫data.bin的文件,将要对其进行输出操作,那么打开文件时应该这样写:

FILE* pf = fopen("data.bin", "wb");

注:data.bin文件若存在,将销毁文件原有内容,再对其进行输出;data.bin文件若不存在,系统将主动创建一个名叫data.bin的文件。

二、检测fopen返回值的有效性

前面说到,如果文件打开成功,fopen函数会返回指向文件信息区的指针,否则fopen函数会返回一个空指针。所以当使用接收fopen函数的返回值的指针前,我们必须检测其有效性,否则可能非法访问内存。

检测有效性:

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//失败返回
	}
	//使用...

相对路径与绝对路径

填写fopen函数的第一个参数的时候,如果我们要打开的文件与我们正在运行的源代码在同级目录下(以打开data.txt文件为例),那么我们应该这样写:

FILE* pf = fopen("data.txt", "r");//同级

但是如果我们想要打开的文件与当前运行的源代码不在同一级目录下呢?
这时我们的写法有两种,相对路径和绝对路径。

一、相对路径

当待打开的文件位于正在运行的源代码的上一级时:

FILE* pf = fopen("../data.txt", "r");//上一级

当待打开的文件位于正在运行的源代码的上上级时:

FILE* pf = fopen("../../data.txt", "r");//上上级

当待打开的文件位于正在运行的源代码的下一级时:

FILE* pf = fopen("Debug/data.txt", "r");//下一级

注:这里data.txt文件在Debug文件内,Debug文件与正在运行的源代码在同级目录下。

总结

要打开上级的文件在原来的基础上加上". ./“,再上一级再加一个”. ./",以此类推。
要打开下级的文件,就需从源代码这一级开始,写出目标文件的路径。

二、绝对路径
有博友可能觉得相对路径的方法比较麻烦(可能还要去数目标文件与源文件相差的级数),绝对路径就没那么麻烦了,绝对路径就直接写出目标文件的完整路径即可,例如:

FILE* pf = fopen("D:\\code\\File_function\\File_function\\data.txt", "r");

注:文件的路径原本为"D:\code\File_function\File_function\data.txt",但是为了防止字符串中的’\‘及其后面的字符被整体视为为转义字符,所以需要在每个’\‘后面再加一个’\’。

文件关闭函数-fclose

与动态开辟内存空间时一样,当我们打开文件时,会在内存中开辟一块空间,如果我们打开该文件后不关闭,那么这个空间会一直存在,一直占用那块内存空间,所以当我们对一个文件的操作结束时,一定要记住将该文件关闭。这就需要用到fclose函数来关闭文件。

int fclose( FILE *stream );

我们如果要关闭一个文件,那么直接将该文件的文件指针传入fclose函数即可,fclose函数如果关闭文件成功会返回0。与free函数一样,当我们调用完fclose函数将文件关闭后,我们也要将指向文件信息区的指针置空,避免该指针变成野指针。

	fclose(pf);//关闭pf指向的文件
	pf = NULL;//及时置空

文件操作正确流程

知道了如何打开文件和关闭文件,也就相当于知道了如何进入和如何出去,所以当我们要对一个文件进行操作的时候,正确的流程应该是这样的:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)//检测指针有效性
	{
		printf("%s\n", strerror(errno));//错误提醒
		return 1;//失败返回
	}

	//对文件进行一系列操作
	//...

	//关闭文件
	fclose(pf);关闭pf指向的文件
	pf = NULL;//及时置空
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

promQL详细语法介绍

目录 promQL 在表达式中支持的数据类型 简单语法介绍 rate的用法 指标过滤搜索 时间单位 聚合表达式 11个聚合函数 二元运算符&#xff08;Binary Operators&#xff09; 二元运算符优先级 向量匹配 向量一对一匹配 向量一对多/多对一匹配 promQL 在表达式中支持的数据…

抽象类与纯虚函数的具体应用

运行代码&#xff1a; //定义一个带有一个纯虚函数pvf()的B2类 //定义D21类&#xff0c;包含一个string数据成员和一个覆盖pvf()的成员函数&#xff0c;D21::pfv()输出string数据成员的值 //定义D22类&#xff0c;它与D21类一样&#xff0c;只是数据成员为int类型 //定义函数f…

数据库应用:MySQL数据库SQL高级语句与操作

目录 一、理论 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 二、实验 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 三、总结 一、理论 1.克隆表与清空表 克隆表&#xff1a;将数据表的数据记录生成到新的表中。 &#xff08;1&#xff0…

【算法集训之线性表篇】Day 04

文章目录 题目一分析思路一思路二 代码实现效果题目二分析代码实现效果 题目一 从有序顺序表中删除所有其值重复的元素&#xff0c;使所有元素的值都不相同。 分析 思路一 首先&#xff0c;在有序顺序表中&#xff0c;所有值重复的元素相邻。为此&#xff0c;我们只需顺序访…

如何批量复制淘宝商品上传上架到虾皮 shopee (轻松学会宝贝复制技巧)

今天&#xff0c;入驻虾皮的商家越来越多&#xff0c;且很多的 shopee 店主在国内都开了淘宝店&#xff0c;当 shopee 店铺入驻成功后&#xff0c;想把淘宝店铺的商品搬到 shopee&#xff0c;怎么搬呐&#xff1f; 方法 / 步骤 方法1&#xff1a;整理你想要采集的店铺首页链接…

MySQl数据库第六课-------SQl命令的延续------快来看看

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————————— 目录 SQl语句 数据库操作 数据表操作 SQL增删 ———————————————————————————— 插播小知识 1…

stm32(独立看门狗和窗口看门狗)

独立看门狗介绍 什么是看门狗&#xff1f; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造 成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继续工作…

setTimeout

Promise延时的几种表述方法 第一种 var pdocument.getElementById("demo"); async function myFunction(){await new Promise(function(resolve){setTimeout(function(){p.innerHTML"延时成功";resolve();},1000);}); } myFunction();第二种 var pdocum…

完了完了完了!线上发生 OOM 了!

现象 线上某个服务有接口非常慢&#xff0c;通过监控链路查看发现&#xff0c;中间的 GAP 时间非常大&#xff0c;实际接口并没有消耗很多时间&#xff0c;并且在那段时间里有很多这样的请求。 原因分析 先从监控链路分析了一波&#xff0c;发现请求是已经打到服务上了&#…

ViperGPT解析:结合视觉输入与文本查询生成和执行程序

ViperGPT&#xff1a;结合视觉输入与文本查询生成和执行程序 ViperGPT 是一个混合视觉和语言处理模型&#xff0c;旨在解决视觉查询问题。这种问题需要视觉处理和推理能力的结合&#xff0c;ViperGPT通过利用代码生成模型&#xff0c;将视觉和语言模型组合成子例程&#xff0c…

【Java】弄清多态,看这一篇就够了|由浅入深,保姆级详解

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 在上篇【Java】还不理解继承&#xff1f;一篇文章看懂继承|继承入门&#xff0c;我们了解了继承的概念、如何时两个类建立继承关系is-a、以及…

AndroidUI绘制流程

Android源码阅读 UI绘制流程 环境 Java 11android 11 由于学习的课程api 不一致 导致源码有些关键方法无法进入仔细阅读 采用截图的方式理解思路 view添加到窗口 进入到源码中可以发现 &#xff0c;每个activity 默认生成的代码中都会有一个setContentView方法&#xff0c…

Python采集课堂视频教程, m3u8视频解密

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用&#xff1a; requests >>> pip install requests pycryptodome --> pip install pycryptodome re 第三方模块安装方法&#xff1a; win R 输…

SpringBoot+MinIO实现minio部署和使用

Minio是一个go编写基于Apache License v2.0开源协议的对象存储系统,是为海量数据存储、人工智能、大数据分析而设计&#xff0c;它完全兼容Amazon S3接口&#xff0c;十分符合存储大容量的非结构化数据从几十kb到最大5T不等。是一个小而美的开源分布式存储软件。 特点 简单、可…

windows系统下载大白菜制作iso镜像文件

背景 1. ventory制作了U盘启动盘&#xff0c;ventory只能加载iso文件&#xff0c; 我们有些操作需要进入到winpe系统进行操作&#xff0c;故需要制作大白菜pe的iso文件 操作步骤 下载大白菜 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页 (windowsrw.…

一个判断 I2C 总线通信异常原因的方法

一个判断 I2C 总线通信异常原因的方法 参考链接 【经验分享】一个判断 I2C 总线通信异常原因的方法 (stmicroelectronics.cn)https://shequ.stmicroelectronics.cn/thread-633302-1-1.html 至于如何在i2c总线中如何使用还没有弄明白。后续再看。 使用方法记录 阻值分配 图中…

Confidence Regularized Self-Training 阅读笔记

Confidence Regularized Self-Training 领域自适应研究的最新进展表明&#xff0c;深度自训练是实现无监督领域自适应的有效手段。这些方法通常涉及到一个迭代过程&#xff0c;即在目标域上进行预测&#xff0c;然后将自信的预测作为伪标签进行再训练。然而&#xff0c;由于伪…

泛微打造国资委国企双端的监管平台,数据互联,动态管理

数字政府和数字监管成为趋势。数字化方式能够助力完善国有资产管理体制&#xff0c;促进国有资产保值增值&#xff0c;推动国有资本做强做优做大&#xff0c;有效防止国有资产流失。 国资监管过程中存在着诸多挑战 监管企业众多&#xff0c;需要建立不同的管理模式。既要发挥…

C/C++库函数之——str类和mem篇(常用速学)

目录 一&#xff0c;str类 1&#xff09;strlen 2&#xff09;strcpy 3&#xff09;strcmp 4&#xff09;strcat 5&#xff09;strstr 二&#xff0c;mem类函数 1&#xff09;memcpy 2&#xff09;memmove 一&#xff0c;str类 1&#xff09;strlen 用途&#xff1a…

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系,多少钱一套预算?

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系&#xff0c;多少钱一套预算&#xff1f; 一&#xff1a;光伏5G多合一融合终端的功能 光伏5G多合一融合终端的功能&#xff1a;群调群控/AGC/AVC功…