【C语言】文件操作(下)

前言

在之前文件操作(上)文件操作(中)的文章中,我从为什么要使用文件再到文件的打开和关闭操作给大家解读了文件在内存中运行的底层原理,但是我并未介绍文件的一下详细的读写操作。那么,在本文我就给大家介绍文件的一系列读写操作

1. 文件的读和写

读文件就是从文件中读取数据到内存中,写文件就是把内存中的一些数据写入到文件中。

可能有的读者会问,这么简单的道理为什么还要拿出来单独的讲?因为在我自己学习文件初期时,常常会被读写这两个字眼弄得晕头转向。倒不是说有多难理解,关键在于弄清谁是读写的主体。

什么意思呢?就是文件可用作为读写的对象,那内存不也大致认为可以进行读写。
再详细一点就是,内存也可以作为读写的对象,然而内存的读写与文件的读写两种不同的说法,背后的逻辑确是完全相同的。

比如,我要从文件中读取信息,那就是对文件进行读操作。我要从文件中写入数据,那就是对文件中进行写操作。
再如,我要从文件中输出数据到内存,那就是对文件进行读操作。我要从内存中输入数据到文件,那就是对文件进行写操作。

但是如果我换种说法,结局可能就不一样了。
比如,我要把内存中的数据输出到文件中,而这时对于文件来说,就不是读操作,而是写操作了。所以我们不能只简单看“输入”和“输出”这两个字眼就断定是读操作还是写操作。我们还要看谁是主体。

有一副图可以这么表示(只是以文件为对象):
图解
这里我想告诉大家的就是,一定认清谁是读写的主体,因为这关系到我们之后所使用函数对应的文件打开模式。

2. 文件的顺序读写

2.1 顺序读写函数的介绍

提示:以文件为对象(功能),以内存为对象(适用于)

函数名功能适用于
fgetc字符输入函数(读)所有输入流
fputc字符输出函数(写)所有输出流
fgets文本行输入函数(读)所有输入流
fputs文本行输出函数(写)所有输出流
fscanf格式化输入函数(读)所有输入流
fprintf格式化输出函数(写)所有输出流
fread二进制输入(读)文件输入流
fwrite二进制输出(写)文件输出流

上面说的适用于所有输入流一般指适用于标准输入流其他输入流(如文件输入流);上面说的适用于所有输出流一般是指适用于标准输入流其他输入流(如文件输入流)。

那接下来我将一对一对的为大家讲解上面的函数,内容可能有点多,希望耐心阅读。

2.1.1 fgetc 和 fputc

fgetc函数的原型:
fgetc函数原型

fgetc函数的参数和返回值
需要关注的是fgetc函数的返回值,每当读到文件末尾时,函数就会返回一个EOF(end of file)。这个EOF在C编译器中被定义为-1。

fputc函数的原型:
fputc函数原型
fputc形参和返回值

  • fgetc的功能:将文件中的字符输出到程序中。
  • fputc的功能:将程序中的字符输入到文件中。

案例演示:
fgetc:
fgetc案例演示
fputc:
fputc函数的案例演示

2.1.2 fgets 和 fputs

fget函数的原型:
fgets函数原型
fgets的形参和返回值
fgets:
fgets的案例演示
fgets函数功能:将文件中的文本行数据输入到程序中。

在使用fgets函数时的一些小细节:

  • 当fgets函数读取失败时,会返回一个空指针
  • 针对fgets形参中的int num,这个形参的意思是允许拷贝的最大字节数,其中‘\0’本来就占用这个形参的位置。举个例子,比如我有一个字符串“abc”,现在我让num=3,其在文件中读取的只有2个字节的内容,因为‘\0’本身就占一个字节。(重点)

fputs函数的原型:
fputs函数原型

fputs函数形参和返回值

fputs:
fputs函数案例演示

fputs函数的功能:向文件输入文本行内容。
如果该函数执行成功,那么它将会返回一个非负数的值。

限于篇幅的原因,本次的读写函数就介绍到这里。剩余的读写函数和随机读写函数,我会在之后的文章中于大家分享,敬请期待!!!💖💖💖

3. 文件缓冲区

ANSIC标准(也就是标准C)采用“缓冲文件系统”处理的数据文件。所谓的缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到文件缓冲区,等待文件缓冲区装满数据之后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满内存缓冲区),然后再从缓冲区中逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

图片

也就是说,这个缓冲文件系统有两大主体,分别是文件缓冲区和内存缓冲区,对应着输出缓冲区和输入缓冲区。我内存中有数据输入到文件中时,要等到文件缓冲区被装满时,才会将内容写入文件中。内存缓冲区也是如此,只有等到内存缓冲区被填满时,才会将数据逐个的输入到内存中的程序数据区中。

4. 总结

至此,我就为大家讲完了文件操作的绝大部分的内容了。内容比较多,但对于我们后续学习有关于文件的操作很有帮助。

最后,觉得本系列章节写的不错的话,麻烦给偶点点赞!!!😘😘😘

学习很难,但坚持一定很酷。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值