C语言——文件相关操作补充

news2024/11/24 3:47:09

一、文件读取结束的判定

当我们使用例如fgetc、fgets、fscanf、fread等函数来读取文件内容时,我们可能遇到需要判断文件读取的结束,一般情况下都是通过这些函数的返回值来判断文件读取是否结束。

1、fgetc

返回读取的字符的ASCII值,如果读到文件末尾或发生错误,则返回EOF(通常定义为-1)。

所以在使用fgetc函数读取文件内容时,要判断文件读取的结束则判断fgetc函数的返回值是否是EOF,如果fgetc函数的返回值为EOF,则可能是达到文件结尾,也就是文件读取结束。

例如使用fgetc以一个个字符读取文件的所有内容并打印出来:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	char ch = 0;
	while ((ch = fgetc(pf)) != EOF)//使用fgetc函数的返回值作为判断,如果是EOF,则可能是读取结束
	{
		printf("%c ", ch);
	}
	printf("\n");

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

文件内容为:

运行结果:

2、fgets

返回指向读取字符串的指针,如果读到文件末尾或发生错误,则返回NULL

如果fgets函数的返回值为NULL,则可能是达到文件结尾,也就是文件读取结束。

例如尝试使用fgets函数将文件的内容一行行读取并打印:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	char str[100] = { 0 };
	while (fgets(str,100,pf) != NULL)//使用fgets函数的返回值作为判断,如果是NULL,则可能是读取结束
	{
		printf("%s", str);
	}

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

文件内容:

运行结果:

3、fscanf

返回成功匹配和赋值的输入项数,如果读到文件末尾或发生错误,则返回EOF

如果fscanf函数的返回值为EOF,则可能是达到文件结尾,也就是文件读取结束。

使用fscanf函数格式化读取文件中所有数据:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	int id = 0;
	char name[10] = { 0 };
	int age = 0;
	while (fscanf(pf, "%d %s %d", &id, name, &age) == 3)//使用fscanf的返回值作为判定条件,如果返回值不等于期望匹配项,则可能是文件读取完成
	{
		printf("%d %s %d\n", id, name, age);
	}

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

文件内容:

运行结果:

4、fread

函数原型:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

返回成功读取的元素个数,如果读到文件末尾或发生错误,则返回值可能小于count

文件内容,使用下面的程序写入test.bin文件中:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.bin", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	fwrite(arr, sizeof(int), sizeof(arr) / sizeof(int), pf);

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

使用二进制编辑器打开查看(这里是小端字节序):

使用fread读取十个整形数据:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.bin", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	int temp = 0;
	while (fread(&temp, sizeof(int), 1, pf) == 1)//以fread函数的返回值为判定,因为这里读取元素个数为1,正确读取应当返回1,如果返回值不是1,则可能是文件结尾,也就是文件读取完成
	{
		printf("%d ", temp);
	}
	printf("\n");

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

运行结果:

5、总结

  • 对于fgetc,当返回值为EOF时,可能表示文件读取结束。
  • 对于fgets,当返回值为NULL时,可能表示文件读取结束。
  • 对于fscanf,当返回值为EOF时,可能表示文件读取结束。
  • 对于fread,当返回值小于请求的元素个数count时,可能表示文件读取结束。

二、feof和ferror

在上面的文件读取结束的判定中,只是初步的判定,因为对于那些读取文件的函数的特殊返回值不一定是代表文件到了结尾(文件读取结束),也可能是代表文件读取错误。所以我们需要判断是哪一种情况,到底是文件读取结束还是文件读取错误,就需要下面的两个函数。

1、feof

feof函数用于检测文件的结束标志(End-Of-File)。

函数原型:

函数参数和返回值:

参数 stream 是文件流指针,当文件指针到达文件末尾时,feof函数返回非零值(通常是1),否则返回0。

2、ferror

ferror函数用于检测文件操作是否发生错误。

函数原型:

函数参数和返回值:

参数 stream 是文件流指针,如果在文件操作过程中发生错误,ferror函数返回非零值(通常是1),否则返回0。

3、使用示例:

如果需要区分文件结束和读取错误,可以使用feofferror函数。

test.txt文件内容:

下面的代码尝试以一个个字符读取此文件的全部内容,并且打印出来:

#include <stdio.h>

int main() {
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		perror("fopen");
		return 0;
	}

	char ch = 0;
	while ((ch = fgetc(pf)) != EOF) {
		printf("%c ", ch);
	}
	printf("\n");
	if (feof(pf)) {
		printf("文件读取结束\n");
	}
	else if (ferror(pf)) {
		printf("文件读取错误\n");
	}

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

运行结果:

在上述代码中,feof(file)用于检查是否到达文件末尾,而ferror(file)用于检查是否发生了读取错误。这里的结果是文件读取结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

能源效率:未来可持续发展的全球当务之急

当前全球正面临着严重的能源与气候危机&#xff0c;能源消耗不断增长导致环境污染、气候变化等问题日益严重。在这一背景下&#xff0c;提高能源效率成为了当务之急。今天&#xff0c;我们来简要探讨一下能源效率在全球可持续发展中的重要性&#xff0c;重点关注建筑物能源效率…

了解当前经济,VBA一键获取不同货币实时汇率

了解当前经济数据,VBA一键获取不同货币间实时汇率 当下较火的经济新闻:黄金价格、日元贬值、美元加息等,咱们不去分析了解这些经济变动背后的动机及原因,做一点本份的事,如何用VBA获取不同货币之间的实时汇率。这肯定是需要联网的,现从“外汇查询” 网站(https://www.wa…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化 引言 在数字化时代&#xff0c;网站和应用程序必须跨越地域限制&#xff0c;服务于全球…

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

第3周 后端微服务基础架构与前端项目联调配备

第3周 后端微服务基础架构与前端项目联调配备 1. 微服务项目层次设计与Maven聚合1.1 项目层次设计1.2 父项目pom1.2.1 打包方式 1.3 创建通用 ************************************************************************************** 1. 微服务项目层次设计与Maven聚合 1.1…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符&#xff08;变量、函数、属性或函数参数的名称&#xff09;&#xff1a;一般使用驼峰法命名&#xff0c;关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线&#xff08;_&#xff09;或美元符号…

MySQL数据库基础(数据库操作,常用数据类型,表的操作)

MySQL数据库基础&#xff08;数据库操作&#xff0c;常用数据类型&#xff0c;表的操作&#xff09; 前言 数据库的操作1.显示当前数据库2.创建数据库3.使用数据库4.删除数据库 常用数据类型1.数值类型2.字符串类型3.日期类型 表的操作1.查看表结构2.创建表3.删除表 总结 前言 …

【电子实验3】简单变调电子门铃

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

Maven:Maven基础

Maven apache旗下的一个开源项目,一款用于管理和构建java项目的工具 什么是Maven 一个项目管理和构建工具,基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档. Maven的作用 依赖管理 方便快捷的管理项目依赖的资源jar包,避免版本冲突问题 统一…

微信小程序的Vant Weapp组件库(WeUI组件库)

一、定义&#xff1a; 是一套开源的微信小程序UI组件库。提供了一整套UI基础组件和业务组件&#xff0c;能够快速地搭配出一套风格统一的页面 二、使用&#xff1a; &#xff08;1&#xff09;&#xff08;找到.eslintrc.js 右键&#xff0c;在内件终端打开&#xff09;打开命…

springcloud整合网关(springcloud-gateway) 跨域处理

pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册 --><dependency><groupId>com.alibaba.cloud</groupId&…

抛弃Elasticsearch ,MeiliSearch 从入门到入门,现在不精通

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

事件高级。

一、注册事件&#xff08;绑定事件&#xff09; 就是给元素添加事件 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 1 传统注册方式 方法监听注册事件 2、 addEventListener 事件监听方式 里面的事件类型是字符串&#xff0c;必定加引号&#xff0c;而且不带o…

【DIY小记】深圳万象天地餐馆探店点评

第一次在技术博客里面写生活日记&#xff0c;也算是破了个小天荒。个人以为&#xff0c;博客是个人生活思考的载体&#xff0c;而技术只占生活的一部分&#xff0c;那么博客里为什么一定要限制只能够写技术内容&#xff0c;不能写点其它生活上的东西呢&#xff1f;思来想去&…

WHAT - CSS Animationtion 动画系列(三)- 动画卡顿分析

目录 一、背景二、动画卡顿具体分析三、具体优化方法3.1 JavaScript:优化 JavaScript 代码1. requestAnimationFrame 优化2. Web Worker3.2 Style:减少 DOM 操作3.3 Layout:避免频繁触发布局的动画3.4 避免强制同步布局事件3.5 Paint&Composite:GPU加速一、背景 自 HT…

查询新加 字段不返回数据要看 有没有 AllInfoResultMap 有要再里面加字段

查询新加 字段不返回数据要看 有没有 AllInfoResultMap 有要再里面加字段

深度学习+计算机视觉

在旷视 这个ai四小龙 深度学习 是必不可少&#xff0c;而且这年头…… 机器学习:在预定义的可能性空间中&#xff0c;利用反馈信号的指引&#xff0c;在输入数据中寻找有用的表示和规则 原理 a. 对神经网络的权重&#xff08;有时也被称为该层的参数&#xff09;进行随机赋值…

MFC的view视图为何不能拖入控件

在MFC中&#xff0c;View类通常用于显示和处理应用程序的数据&#xff0c;而不是直接用于设计用户界面。因此&#xff0c;默认情况下&#xff0c;MFC的View类是不支持在设计时拖动控件的。 MFC中设计用户界面通常使用的是对话框类&#xff08;Dialog&#xff09;或窗口类&…

C++入门必读-Qt的安装与配置

QT简介 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 QT下载 访问下载网站: Index of /archive/qt 安装编译器 QT安装 建议安装之前将网络断…

从关键新闻和最新技术看AI行业发展(2024.4.22-5.5第二十二期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…