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

一、文件读取结束的判定

当我们使用例如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.mzph.cn/pingmian/11061.shtml

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

相关文章

JUnit 4单元测试常用注解和方法

引言 JUnit 4作为Java开发者广泛使用的测试框架&#xff0c;通过提供丰富的注解和断言方法&#xff0c;极大地简化了单元测试的编写和维护。本文将介绍JUnit 4的核心特性和最佳实践。 单元测试的重要性 独立性&#xff1a;每个测试应该是独立的&#xff0c;不依赖于系统状态…

Java 守护线程 ( Daemon Thread )详解

在Java中&#xff0c;线程分为两类&#xff1a;用户线程(User Thread)和守护线程(Daemon Thread)。守护线程是后台线程&#xff0c;主要服务于用户线程&#xff0c;当所有的用户线程结束时&#xff0c;守护线程也会自动结束&#xff0c;JVM会随之退出。守护线程的一个典型例子是…

kaggle竞赛实战1

我们最终的目标是要打比赛、进大厂&#xff0c;因此在熟悉了基本模型后先来看看比赛怎么做的&#xff0c;本文以Elo Merchant Category Recommendation | Kaggle 为样例进行介绍。 首先注意使用kaggle要全程“科学上网”&#xff0c;否则在注册、下载数据等环节都会出现页面挑…

Web前端一套全部清晰 ⑧ day5 CSS.3 选择器、PxCook软件、盒子模型

谁不是一路荆棘而过呢 —— 24.5.12 CSS.3 选择器、PxCook软件、盒子模型 一、选择器 1.结构伪类选择器 1.作用: 根据元素的结构关系查找元素。 选择器 说明 E:first-child 查找第一个 E元素 E:last-child 查找最后一个E元素 E:nth-chil…

计算机网络-负载均衡算法

计算机网络中的负载均衡算法是决定如何将请求分发到各个服务器的关键。目前负载均衡算法主要分为静态负载均衡算法和动态负载均衡算法&#xff0c;具体包括以下几种&#xff1a; 静态负载均衡算法&#xff1a; 1.轮询法&#xff08;Round Robin&#xff09;&#xff1a;按照顺…

【qt】最快的开发界面效率——混合编程

混合编程 一.准备工作1.创建项目2.添加项目资源 二.ui界面设计1.menuBar菜单栏2.action ▲3.toolBar工具栏4.中心组件 三.代码界面设计1.toolBar添加组件2.statusBar状态栏添加组件 四.完成界面的功能1.对action配置信号槽2.对action转到信号槽3.代码添加的组件手动关联槽函数 …

Django REST framework(DRF)是什么?

Django REST framework&#xff08;DRF&#xff09;是什么&#xff1f; Django REST framework&#xff08;简称DRF&#xff09;是一个强大且灵活的工具包&#xff0c;用于构建Web API。它是基于Django&#xff08;一个高级Python Web框架&#xff09;构建的&#xff0c;提供了…

oracle 行转列及列转行

行转列 使用pivot函数实现 行转列 with temp as( select 四川省 nation ,成都市 city,第一 ranking from dual union all select 四川省 nation ,绵阳市 city,第二 ranking from dual union all select 四川省 nation ,德阳市 city,第三 ranking from dual union all select 四…

7 Days yo Die 七日杀服务器开服联机教程

1、购买后登录服务器&#xff08;百度搜索莱卡云&#xff09;game.lcayun.com 进入控制面板后会出现正在安装的界面&#xff0c;安装时长约5分钟左右 安装成功后你就可以看到我们的控制台界面 复制服务器ip地址打开游戏➡加入游戏 有两种方法加入游戏 第一种方法&#xff1a;…

三. TensorRT基础入门-导出并分析ONNX

目录 前言0. 简述1. generate-onnx2. export-onnx3. 补充-ONNX3.1 概念3.2 组成 总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第三章—TensorRT 基础入门&#xff0…

redis深入理解之实战

1、SpringBoot整合redis 1.1 导入相关依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

纯CSS实现步骤条

纯CSS实现纵向Steps步骤条效果 效果图 实现思路 步骤条是一种用于引导用户按照特定流程完成任务的导航条&#xff0c;在各种分步表单交互场景中广泛应用。步骤条通常由编号、名称和引导线三个基本要素组成。本文中要实现的是一个简单的步骤条&#xff0c;包含上述三个基本要素…

SpringBoot结合Canal 实现数据同步

1、Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具&#xff0c;用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…

计算机网络技术主要学什么内容,有哪些课程

计算机网络技术专业是一个涉及理论与实践紧密结合的学科&#xff0c;主要学习内容有计算机网络基础、网络设备技术、网络编程等内容&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;整理的计算机网络技术主要学什么内容&#xff0c;供大家参考&#xff01; 基…

20.接口自动化-Git

1、Git和SVN–版本控制系统 远程服务出问题后&#xff0c;可以先提交commit到本地仓库&#xff0c;之后再提交push远程仓库 git有clone Git环境组成部分 常用Git代码仓库服务-远程仓库 GitHub-服务器在国外&#xff0c;慢 GitLab-开源&#xff0c;可以在自己服务器搭建&…

根据docker部署nginx并且实现https

目录 一、Docker中启用HTTPS有几个重要的原因 二、https介绍 三、https过程 四、安装docker-20.10.18 五、如何获取证书 通过阿里云获取证书 六、docker部署nginx并且实现https 6.1准备证书 6.2准备nginx.conf 和 index.html文件 6.3生成容器 6.4浏览器验证证书 一、…

PyTorch的基础用法简介

PyTorch是一个基于Python的开源机器学习库&#xff0c;它提供了灵活的神经网络构建和训练工具。下面是PyTorch的基础用法介绍&#xff1a; 张量&#xff08;Tensors&#xff09;&#xff1a;PyTorch中的基本数据结构是张量&#xff0c;它类似于多维数组。可以通过torch.Tensor…

ssm120基于SSM框架的金鱼销售平台的开发和实现+jsp

金鱼销售平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于金鱼销售平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了金鱼销售平台&#xff0c;它彻底改…

Oracle一键安装脚本安装教程合集

目前 Oracle 一键安装脚本已经更新到第四代&#xff0c;经作者测试以下版本均可成功安装&#xff01; RedHat/Centos/OracleLinux 6.10 ✅ Oracle 11GR2&#xff08;231017&#xff09;单机Oracle 11GR2&#xff08;231017&#xff09;单机 ASMOracle 11GR2&#xff08;23101…

栈与队列的实现

前言 本次博客将要实现一下栈和队列&#xff0c;好吧 他们两个既可以使用动态数组也可以使用链表来实现 本次会有详细的讲解 栈的实现 栈的基础知识 什么是栈呢&#xff1f; 栈的性质是后进先出 来画个图来理解 当然可不可以出一个进一个呢&#xff0c;当然可以了 比如…