C语言:文件操作集合,干货满满!

啥是文件

我们之前说过要实现通讯录的第三次升级,即文件版本的通讯录。那么为啥要有文件版本的呢?因为我们平时在使用通讯录这样的程序的时候,我们不能每次打开都是从头输入联系人吧。因此,这也是为什么我们需要将文件操作加入通讯录中,是为了让我们的程序不只是一次性的,也具有保存数据的功能。
好了,说了一下大概的用途,我们就来了解一下啥是文件吧
文件的话,广义的说,磁盘上的东西都可以成为文件

文件的分类

那么在我们的程序设计里面,我们将文件分成程序文件和数据文件
程序文件:包括源程序文件(如文件后缀名带.c的),目标文件(Window环境下后缀为.obj),可执行程序(Window环境下后缀为.exe)
数据文件:不是程序,而是程序运行中可能读取的数据,比如在程序运行中要从一些文件里读取数据,或者向一些文件里写入数据

文件名

一个文件要有唯一的标识让用户识别和使用
文件名:文件路径+文件名主干+文件名后缀
比如在这里插入图片描述

对于test.c文件来说,F:\编程\c语言\2021_3\2021_3_24\test 就是它的文件路径,test就是它的文件名主干,.c就是它的文件名后缀
这里简单了解一下就好

文件类型

这里需要注意,我们的文件从类型上来说可分为文本文件和二进制文件
二进制文件:数据本来是以二进制的形式存储在内存里面的,如果它不加转换后直接输出到外存,就叫二进制文件
文本文件:如果在外存中要求以ASCII码值进行存储,那么就需要在存储之前进行转换,转换之后以ASCII码字符形式存储的文件就叫文本文件

那么一个数据在内存中是如何存储的呢?
如果是字符,一律是用ASCII码方式存储,数字的话既可以用ASCII码字符形式存储,也可以用二进制存储
假如这里有整数1234,那当它输入进磁盘存储的时候,它既可以用四个字符’1’,‘2’,‘3’,‘4’来输入磁盘,也可以用二进制010011010010来输入磁盘。
具体用哪种方式就取决于我们用’w’还是’wb’(详见下文)。

文件缓冲区

啥是文件缓冲区呢?
ANSIC C标准(美国国家标准协会对C语言的发布的标准)会采用缓冲文件系统的形式来处理数据文件,所谓的缓冲文件系统就是系统会自动的在内存中为每一个正在使用的内存开辟一块“文件缓冲区”,从内存向磁盘(屏幕,输出流都一样)中输出的数据会先输送到输出缓冲区,等到缓冲区装满以后,再送到磁盘中。同理,从磁盘(也可以是从键盘,输入流都一样)中向内存输入数据时,也会先将数据送到输入缓冲区内,等到缓冲区装满后,再送入到内存中。
在这里插入图片描述

文件指针

了解我们上面的文件缓冲区以后,我们就可以继续来了解我们的文件指针,文件指针和我们之前学习到的指针也差不多,只不过它是指向一个文件的,但是我们所知道的文件是并不在程序内存中,而是在磁盘中,那么它是如何指向一个文件呢?
每一个文件在使用的时候都会在内存中开辟一个对应的文件信息区,文件信息区对于文件来说相当于函数传参的时候形参相当于实参的拷贝一样。如下图
在这里插入图片描述

这些文件信息是被存储在一个开辟的结构体中,如下图,在stdio.h中我们可以查看以下的文件类型声明。
在这里插入图片描述

文件的打开和关闭

明白了文件时被拷贝在内存中的时候,我们就可以更好的理解如何打开和关闭一个文件。

fopen

fopen 是C语言中打开一个文件的函数,其原型是:FILE fopen(const char firename,const char mode)。第一个参数是打开文件的名称,第二个参数是打开文件的方式。如果打开失败,那么就会返回一个空指针,因此在我们打开文件之后,我们需要对文件指针进行检查*。文件名很好理解,那么打开方式有哪些呢?可以参照下图并进行记忆。
在这里插入图片描述

注意:在测试中博主发现a+与ab+会建立新文件,同时依然会报错
直接让读者去记忆确实有点多,下面我给读者总结一些记忆的技巧和它们各自需要记住的特点
1.首先,r(read 读),w(write 写),a(add 追加)这三个一定要记住。
2.对于读来说,这是当你要从文件里面输入(也可以理解成提取)数据的时候使用,你用r打开一个文件的时候,文件本身并不会发生改变。
3.对于写来说,它既有一个剪切的功能,也就是你如果使用写打开一个文件,那么源文件里面的内容将会消失,因此对应的当你将数据写入文件的时候相当于在一个空文件里面写,写什么都是新定义的,与之前无关。
4.对于追加来说,它就不会毁坏源文件里面的内容,因为打开文件时返回的文件指针就指向文件的末尾。
5.了解了上面几点后对于b(binary)和+(增加了读和写功能),只需要对应的将文本文件换成二进制文件,以及功能变成读写兼有。
6.另外对于如果文件不存在的情况,要记住3点,1. r 及其衍生的模式均会报错 。 2. w 及其衍生的模式永远会建立一个新的对应文件。
3. a及其衍生的模式均会报错

虽然感觉上面的要点有点多,但是你要尝试理解着去记忆,那么要点会帮助你很好的记忆关于文件打开的各种模式及其对应的情况。
最后再总结一下,就是a和r不能在无文件的情况下对文件进行打开,均会报错,只有w适用于无文件的情况。
下面给一些简单的代码示例

int main()
{
   
	FILE *pf = fopen("file.txt", "r");
	if (pf == 
  • 27
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值