c语言中的文件操作(2)

ops/2024/11/14 21:47:39/

文件的打开-fopen

函数介绍

文件的打开方式

相对路径与绝对路径

文件关闭函数fclose

文件操作的正确流程

函数的介绍
文件的打开形式
相对路径与绝对路径
文件的关闭函数-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.若我们要以文本形式打开一个名叫test.txt的文件,将要对其进行输入操作,那么打开文件时应该这样写:

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

该文件必须存在,否则会返回空指针。
2.若我们要以二进制打开一个名叫test.txt的文件,将要对其进行输出操作,那么打开文件时应该这样写:

FILE* pf = fopen("test.txt", "wb");

注意一点就是如果该文件不存在则将会自己创建一个名叫test.txt的文件。
二、检测fopen返回值的有效性
前面说到,如果文件打开成功,fopen函数会返回指向文件信息区的指针,否则fopen函数会返回一个空指针。所以当使用接收fopen函数的返回值的指针前,我们必须检测其有效性,否则可能非法访问内存。
检测有效性:

int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror(fopen);return 1;}return 0;
}

文件的相对路径与绝对路径

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

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

但是如果打开的文件与当前运行的文件不在同一个目录内,我们分为相对路径和绝对路径。
一相对路径
当待打开的文件位于正在运行的源代码的上一级时:

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

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

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

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

FILE* pf = fopen("debug/test.txt", "r");

注意的是这里的test文件位于debug内,debug文件与正在运行的源代码在同级目录下。
总结:
要打开上级的文件在原来的基础上加上". ./“,再上一级再加一个”. ./",以此类推。
要打开下级的文件,就需从源代码这一级开始,写出目标文件的路径。

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

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

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

int fclose ( FILE * stream )

我们如果要关闭一个文件,那么直接将该文件的文件指针传入fclose函数即可,fclose函数如果关闭文件成功会返回0。与free函数一样,当我们调用完fclose函数将文件关闭后,我们也要将指向文件信息区的指针置空,避免该指针变成野指针。
文件操作正确流程
知道了如何打开文件和关闭文件,也就相当于知道了如何进入和如何出去,所以当我们要对一个文件进行操作的时候,正确的流程应该是这样的:

int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror(fopen);return 1;}//对文件的一系列操作//关闭文件fclose(pf);pf = NULL;return 0;
}

http://www.ppmy.cn/ops/133689.html

相关文章

Hbase Shell

一、启动运行HBase 首先登陆SSH,由于之前在Hadoop的安装和使用中已经设置了无密码登录,因此这里不需要密码。然后,切换至/usr/local/hadoop,启动Hadoop,让HDFS进入运行状态,从而可以为HBase存储数据&#…

kafka是如何处理数据乱序问题的?

1.数据有序 生产者发送的数据,单分区内可以做到有序,多分区无法保证,除非把多个分区的数据拉取到消费端,进行排序,但是这样做效率很低,不如直接设置一个分区 2.数据乱序 1)kafka在1.x版本之前…

php回调函数(匿名)的使用

在 PHP 中&#xff0c;回调函数&#xff08;或匿名函数&#xff09;可以通过参数传递值&#xff0c;通常是在调用该回调时提供的。回调函数可以接收传入的值&#xff0c;并在其内部使用这些值。 <?php/*** php回调函数&#xff08;匿名&#xff09;的使用* 通过参数传递值…

华为大变革?仓颉编程语言会代替ArkTS吗?

在华为鸿蒙生态系统中&#xff0c;编程语言的选择一直是开发者关注的焦点。近期&#xff0c;华为推出了自研的通用编程语言——仓颉编程语言&#xff0c;这引发了关于仓颉是否会取代ArkTS的讨论。本文将从多个角度分析这两种语言的特点、应用场景及未来趋势&#xff0c;探讨仓颉…

网上商城系统:Spring Boot框架的实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网上商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

vue2父传子,子传父通信

在Vue 2中&#xff0c;父子组件之间的通信可以通过props和$emit来实现。 父传子&#xff1a; 在父组件中绑定要传递的数据到子组件的属性上。 在子组件中通过props选项声明接收的属性。 子传父&#xff1a; 在子组件中使用$emit方法触发一个事件&#xff0c;并传递数据。 …

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…

Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景

基于 Servlet 的 Web 应用 (Servlet Web) 特点 使用传统的 Servlet API 和 Spring MVC 框架。 采用阻塞 I/O 模型&#xff0c;每个请求都会占用一个线程直到请求处理完毕。 适合处理同步请求-响应模式的应用。 依赖 spring-boot-starter-web&#xff1a;这是核心依赖&#xff0…