🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~2022博客之星Top63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+🏅

🆔本文由 謓泽 原创 如需转载还请通知⚠

📝个人主页-​謓泽51Ctop的博客​📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

📣系列专栏-​謓泽51Ctop的博客_【C语言】从0~1_51CTO博客​🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

【C语言】文件的打开和关闭。_数据

🍑🍑🍑文件的打开和关闭🍑🍑🍑 

文件在读写的时候就应该先🍅打开文件🍅

文件在使用结束之后就应该🍅关闭文件🍅

在编写程序的时候,在打开文件的同时,都会返回一个🍅FILE🍅的指针变量指向的文件,也就相当于建立了指针和文件的关系。 

ANSIC 规定了使用 fopen() 函数来打开文件,同时 fclose() 函数是用来关闭文件的。

那么接下来介绍下 🍅fopen()🍅

🍑🍑🍑fopen() 打开文件🍑🍑🍑

📢fopen() 函数声明方式如下↓

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

📢打开文件的方式↓

打开文件名在参数🍅filename🍅中指定的文件,并将其与一个关联起来,该流可以在将来的操作中由返回的🍅FILE🍅指针识别。

  • 这个时候张三同学说"流"是什么啊。
  • 张三同学不要着急,刚想说👻那这里说说什么是"流"。

"流":是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为"流"。

流上允许的操作以及如何执行这些操作由🍅mode🍅参数定义。

如果已知返回的流不引用交互式设备(参考🍅setbuf → 设置流缓冲区🍅),则默认情况下它是完全缓冲的。

返回的指针可以通过调用🍅fclose🍅文件解除关联。所有打开的文件在正常程序终止时自动关闭。

🍓🍓参数的介绍🍓🍓

filename → 包含要打开的文件名称的C语言字符串。它的值应该遵循运行环境的文件名规范,并且可以包含一个路径(如果系统支持的话)。

mode → 包含文件访问模式的C语言字符串。它可以是如下所示↓

  1. "r" read(只读):打开文件进行输入操作。该文件必须存在,文件不在error。
  2. "w" write(只写):为输出数据,打开一个文本文件。如果指定的文件不存在的话,则会建立一个新的文件。
  3. "a"追加:打开文件,在文件的末尾输出。输出操作总是在文件的末尾写入数据,并展开它。重新定位操作(fseek, fsetpos,倒带)被忽略。如果文件不存在,则创建该文件。
  4. "r+"读取/更新:打开一个文件进行更新(包括输入和输出)。该文件必须存在。
  5. "w+"写入/更新:创建一个空文件并打开以进行更新(包括输入和输出)。如果一个同名的文件已经存在,它的内容将被丢弃,并且该文件将被视为一个新的空文件。
  6. "a+" append/update(读写):打开一个文件进行更新(包括输入和输出),所有输出操作都在文件的末尾写入数据。重新定位操作(fseek, fsetpos, rewind)影响下一个输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。

🍉返回值🍉

如果文件被成功打开,该函数将返回一个指向🍅file🍅对象的指针,该指针可用于在将来的操作中标识流。

否则,返回一个空指针。在大多数库实现中,🍅errno🍅变量在失败时也被设置为特定于系统的错误代码。

那么在演示 fopen() 打开文件的示例之前,我们先了解下什么是关闭文件。


🍓🍓fclose() 关闭文件🍓🍓

📢 fclose() 函数声明方式如下↓

int fclose ( FILE * stream );

📢关闭文件的方式↓

关闭与流关联的文件并解除关联。

所有与流关联的内部缓冲区都与流分离并刷新:任何未读输出缓冲区的内容都被写入,任何未读输入缓冲区的内容都被丢弃。

即使调用失败,作为参数传递的流将不再与文件或其缓冲区相关联。 

  • 参数→stream

指向🍅FILE🍅对象的指针,该对象指定要关闭的流。


🍑🍑🍑fopen()代码示例🍑🍑🍑

接下来我们来打开一个文件来康康,分别示例 r 和 w 代码示例如下↓

【C语言】文件的打开和关闭。_数据_02

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
FILE* pf = fopen("test.txt", "r");
//文件没在
if (pf == NULL)
{
perror("fopen");
return 1;
}
printf("文件存在\n");
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}

运行结果:此时,文件是存在的。 

那我们把 test.txt 的文件给进行删除,看看此时的运行结果。

【C语言】文件的打开和关闭。_字符串_03

当我们把 test.txt 的文件给进行删除,返回的是空指针。

张三:那我们在 🍅fopen()🍅 的 mode 参数 换成 "w" 来试下看下会出现什么样子的情况。

ヾ(^▽^*)))好哒!

先说下,文件在的情况下。实际上文件在的情况下和上面的情况都是一模一样的,这里就不再追述了,自己可以试下。重点讲下文件没在的情况。

【C语言】文件的打开和关闭。_打开文件_04

此时,我们运行这段代码看看会有什么神奇的事情会发生(●'◡'●)

FILE* pf = fopen("test.txt", "w");//修改下参数即可!

【C语言】文件的打开和关闭。_字符串_05

让我们来康康运行结果吧,不要眨眼( •̀ .̫ •́ )✧

【C语言】文件的打开和关闭。_字符串_06

张三:什么情况,它竟然文件存在,不对啊我们不是把 test.txt 文件删除了。它怎么会存在呢。这......

"张三同学一看你就是没看我上面写的博客"(⌐■_■),你再去上面我写的参数 🍅mode🍅介绍那里在仔细的看看。

【C语言】文件的打开和关闭。_打开文件_07

张三:原来如此,那我们赶紧看看那个文件不存在建立了一个新的文件没有。好的(☆-v-) 

【C语言】文件的打开和关闭。_字符串_08

从上述截屏当中我们可以发现,它自己雀氏是新建了一个 test.txt 的文件。

张三:这该不会是你偷偷创建的吧(doge),我:🔥🔥🔥

当然,这里还有很多参数🍅mode🍅感兴趣的小伙伴们,可以自己尝试下。这里就不再一一介绍了。不然,有点多,博主手痛不想打这么多的字(๐॔˃̶ᗜ˂̶๐॓)