88.【C语言】文件操作(6)

#1024程序员节 | 征文#

文件读取结束的判定和文件缓冲区

1.文件读取结束的两种原因

1.遇到文件末尾而结束(EOF:End Of File)

备注:有关EOF的讲解在78.【C语言】EOF的解释

2.因文件读取失败而结束

2.cplusplus网对feof和ferror函数的介绍

1.feof函数

cplusplus的介绍 点我跳转

翻译

函数

feof


int feof ( FILE * stream );

检查文件末尾标志(也可以翻译为指示器) (EOF:End Of File)

检查与流(stream)相关联的文件结束标志是否已设置,如果设置,则返回一个非0的数字,

这个标志通常被前一个流中的操作所设置,表明读到了EOF标志或其后

注意到流的内部位置指示器可能指向下一次操作的文件末尾**,**但文件结束标志可能要等到某个操作尝试读取该点时才会设置

这个标志可以通过调用clearerr,rewind,fseek,fsetpos和freopen来清除.尽管如果这些调用没有重新定位标志,下一次 I/O 操作很可能会再次设置该标志

参数


stream:文件指针

返回值


当与流(stream)相关联的文件结束标志已设置时,返回一个非0的数字,否则返回0

2.ferror函数

cplusplus的介绍 点我跳转

翻译:

函数

ferror


int ferror ( FILE * stream );

检查错误标志

检查与流(stream)相关联的文件错误标志是否已设置,如果设置,则返回一个非0的数字,

这个标志通常被前一个流中的操作所设置,表明错误;错误标志可以调用clearerr,rewind,freopen函数来清除

参数


stream:文件指针

返回值


当与流(stream)相关联的文件错误标志已设置时,返回一个非0的数字,否则返回0

3.如何知道文件读取结束的原因

1.feof是用来判断是否是因为遇到文件末尾而正常结束的

2.ferror函数是用来判断是否是因为读取时发生了错误而异常结束的

注意:不能用feof函数的返回值来直接判断文件是否读取结束!!!

4.代码示例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int c; // 注意:int,非char,要求处理EOF
	FILE* f = fopen("data.txt", "r");
	if (!f) //当f为空指针时
	{
		perror("File opening failed");
		return EXIT_FAILURE;//错误返回,等同于return 1;
	}
	//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	//要判断什么原因而返回EOF,可以用feof和ferror判断
	while ((c = fgetc(f)) != EOF) // 标准C I/O读取文件循环
	{
		putchar(c);
	}

	if (ferror(f))//如果ferror返回非零值
		printf("文件读取错误而返回EOF");
	else if (feof(f))//如果feof返回非零值
		printf("到达了文件的末尾而返回EOF");

	fclose(f);
	f = NULL;
	return 0;
}

5,文件缓冲区

1.ANSIC标准(A merican N ational S tandards I nstitute C)采用"缓冲文件系统";来处理数据文件

2.缓冲文件系统定义:指系统自动地在内存中为程序中每一个正在使用的文件开辟一块"文件缓冲区"

3.过程:从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区,提高操作系统的执行效率),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)

注:fflush函数或fclose函数均会刷新缓冲区

4.缓冲区的大小根据C编译器决定

5.模型图

相关推荐
网易独家音乐人Mike Zhou2 分钟前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
----云烟----2 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024062 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic2 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it2 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神3 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky3 小时前
C语言:数组
c语言·数据结构
宅小海3 小时前
scala String
大数据·开发语言·scala
qq_327342733 小时前
Java实现离线身份证号码OCR识别
java·开发语言