文章目录
前言
在之前文件操作(上)和文件操作(中)的文章中,我从为什么要使用文件再到文件的打开和关闭操作给大家解读了文件在内存中运行的底层原理,但是我并未介绍文件的一下详细的读写操作。那么,在本文我就给大家介绍文件的一系列读写操作。
1. 文件的读和写
读文件就是从文件中读取数据到内存中,写文件就是把内存中的一些数据写入到文件中。
可能有的读者会问,这么简单的道理为什么还要拿出来单独的讲?因为在我自己学习文件初期时,常常会被读写这两个字眼弄得晕头转向。倒不是说有多难理解,关键在于弄清谁是读写的主体。
什么意思呢?就是文件可用作为读写的对象,那内存不也大致认为可以进行读写。
再详细一点就是,内存也可以作为读写的对象,然而内存的读写与文件的读写两种不同的说法,背后的逻辑确是完全相同的。
比如,我要从文件中读取信息,那就是对文件进行读操作。我要从文件中写入数据,那就是对文件中进行写操作。
再如,我要从文件中输出数据到内存,那就是对文件进行读操作。我要从内存中输入数据到文件,那就是对文件进行写操作。
但是如果我换种说法,结局可能就不一样了。
比如,我要把内存中的数据输出到文件中,而这时对于文件来说,就不是读操作,而是写操作了。所以我们不能只简单看“输入”和“输出”这两个字眼就断定是读操作还是写操作。我们还要看谁是主体。
有一副图可以这么表示(只是以文件为对象):
这里我想告诉大家的就是,一定认清谁是读写的主体,因为这关系到我们之后所使用函数对应的文件打开模式。
2. 文件的顺序读写
2.1 顺序读写函数的介绍
提示:以文件为对象(功能),以内存为对象(适用于)
函数名 | 功能 | 适用于 |
---|---|---|
fgetc | 字符输入函数(读) | 所有输入流 |
fputc | 字符输出函数(写) | 所有输出流 |
fgets | 文本行输入函数(读) | 所有输入流 |
fputs | 文本行输出函数(写) | 所有输出流 |
fscanf | 格式化输入函数(读) | 所有输入流 |
fprintf | 格式化输出函数(写) | 所有输出流 |
fread | 二进制输入(读) | 文件输入流 |
fwrite | 二进制输出(写) | 文件输出流 |
上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);上面说的适用于所有输出流一般是指适用于标准输入流和其他输入流(如文件输入流)。
那接下来我将一对一对的为大家讲解上面的函数,内容可能有点多,希望耐心阅读。
2.1.1 fgetc 和 fputc
fgetc函数的原型:
需要关注的是fgetc函数的返回值,每当读到文件末尾时,函数就会返回一个EOF(end of file)。这个EOF在C编译器中被定义为-1。
fputc函数的原型:
- fgetc的功能:将文件中的字符输出到程序中。
- fputc的功能:将程序中的字符输入到文件中。
案例演示:
fgetc:
fputc:
2.1.2 fgets 和 fputs
fget函数的原型:
fgets:
fgets函数功能:将文件中的文本行数据输入到程序中。
在使用fgets函数时的一些小细节:
- 当fgets函数读取失败时,会返回一个空指针
- 针对fgets形参中的
int num
,这个形参的意思是允许拷贝的最大字节数,其中‘\0’本来就占用这个形参的位置。举个例子,比如我有一个字符串“abc”,现在我让num=3,其在文件中读取的只有2个字节的内容,因为‘\0’本身就占一个字节。(重点)
fputs函数的原型:
fputs:
fputs函数的功能:向文件输入文本行内容。
如果该函数执行成功,那么它将会返回一个非负数的值。
限于篇幅的原因,本次的读写函数就介绍到这里。剩余的读写函数和随机读写函数,我会在之后的文章中于大家分享,敬请期待!!!
标签:文件,函数,读写,C语言,内存,缓冲区,操作,输入 From: https://blog.csdn.net/tianxiawushanu/article/details/140793514