上篇博客字数到极限了,给大家把内容补充在这一篇,我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍,让我们开始下面的学习吧!
目录
1.文件读取结束的判定
1.1feof函数
1.2ferror函数
代码示例
2.文件缓冲区
2.1fflush函数
代码示例
1.文件读取结束的判定
关于文件读取结束,它到底是遇到错误结束的还是遇到文件结束标志而结束的需要我们进行判断,此时,我们一般用到两个函数feof函数和ferror函数,让我们来认识一下它们
1.1feof函数
1.函数功能:测试流(文件流或者标准输出流)上的文件结尾
2.头文件:#include<stdio.h>
3.使用格式:int feof( FILE *stream );
4.返回值:
如果尝试读取超过文件末尾的第一次读取操作之后返回一个非零值
如果当前位置不是文件末尾,则返回0
5.但是在我们使用这个函数时,经常有同学错误使用它,归根到底,还是对这个函数不熟悉所导致的,这就需要我们沉下心来,好好看清楚它的具体使用方法
在文件读取过程中,我们是不能用feof函数的返回值直接用来判断文件是否结束的
而是应该应用于当文件读取结束的时候,判断文件是因为读取失败结束还是遇到文件尾而结束
这也就是说,feof是来告诉你文件读取失败的原因的,而不是给你返回一个数值的
例如:
文本文件读取(输出)是否结束,若是使用fgetc函数要判断返回值是否为EOF
二进制文件的读取(输出)是否结束,若是使用fread函数,要判断它的返回值是否小于实际要读的个数
函数具体代码我们与ferror函数一起实现
1.2ferror函数
1.函数功能:测试流(文件流或者标准输出流)中的错误
2.头文件:#include<stdio.h>
3.使用格式:int ferror( FILE *stream );
4.返回值:
如果没有发生错误,ferror将返回0。
如果发生错误,它将返回一个非零值。
下面我们看段代码来加深理解
代码示例
//判断文本文件读取结束 int main() {int c = 0;//以只读模式打开这个文本文件FILE* pf = fopen("test2.txt", "r");if (pf == NULL){perror("fopen");return 1;}//fgetc函数当读取文件失败或者遇到文件结束标志时,都会返回EOFwhile ((c = fgetc(pf)) != EOF){putchar(c);}printf("\n");if (ferror(pf))//文件读取失败遇到错误而结束printf("I/O error when reading");else if (feof(pf))//文件遇到结束标志而结束printf("End of file reached successfully");fclose(pf);pf = NULL;return 0; }
运行结果
这就说明了,文件确实是因为遇到了文件结尾标志而结束的,而不是遇到了错误
我们总结一下:
feof:返回真,说明文件是正常遇到文件结束标志而结束的
ferror:返回真,说明是文件在读取过程中出错了而结束的
2.文件缓冲区
ANSIC标准采用“缓冲文件系统”来处理数据文件的
所谓缓冲文件系统是指系统自动的在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”
从内存向磁盘输出(写入)数据,会先把数据送到内存中的缓冲区,当装满缓冲区后,再从缓冲区一起送到磁盘
从磁盘向计算机输入(读取)数据,会先从磁盘文件中读取数据输入到内存缓冲区,充满缓冲区后,再从缓冲区逐个的将数据送到程序缓冲区
此外,缓冲区的大小是根据C语言编译系统决定的
此时,我们就知道了
数据并不是直接就可以放到磁盘文件中的,只有满足
1.缓冲区放满
2.主动刷新缓冲区
这两种的其中一个才会把数据放到磁盘文件中
这就又引出了一个新的函数fflush,它就是用来刷新缓冲区的函数,此时,大家可能就又会有疑问了,我们前面所写的代码示例也没有出现fflush函数,为什么就被写入文件了,这是因为fclose函数在关闭文件时,也会刷新缓冲区
因为有缓冲区的存在,C语言在操作文件时,需要刷新缓冲区域或者在文件操作结束时关闭文件,如果不这样做,可能导致文件读写失败,数据丢失,此外,缓冲区的大小是可以修改的,我们在这里不做太多说明,以后遇到在进行讲解
2.1fflush函数
1.函数功能:刷新缓冲区
2.头文件:#include<stdio.h>
3.使用格式:int fflush( FILE *stream );
4.返回值:
刷新成功:返回值为0,在指定的流没有缓冲区或只打开进行读取的情况下,也会返回值0
刷新失败:返回值EOF
我们来看个例子加深理解
代码示例
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<errno.h>//测试缓冲区刷新函数int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("hello world\n", pf);//没有进行刷新,此时代码放在缓冲区printf("睡眠10s,我们已经写入数据了,打开对应的test.txt文件发现没有内容\n");Sleep(10000);printf("开始刷新缓冲区\n");fflush(pf);//此时,才将写入缓冲区的数据放到文件(磁盘)中printf("睡眠10s,此时,再次打开test.txt文件,文件中出现了被写入的内容\n");Sleep(10000);fclose(pf);//在关闭文件的同时,也会刷新缓冲区pf = NULL;return 0; }
我们运行代码,它首先出现
然后我们打开对应文件,发现文件中确实没有内容,这也就证明了确实有缓冲区的存在
然后我们在返回程序代码运行窗口,此时出现提示
我们再次打开对应文件,发现文件中已经写入了内容
这就是C语言关于文件操作的全部内容了,这部分内容比较多,大家如果感兴趣的话,一定要戒骄戒躁,沉下心来认真学习,最重要的还是要多敲代码,巩固知识!
ok!大家下期再见!!!