当前位置: 首页 > news >正文

C语言| 文件操作详解(二)

目录

四、有关文件的随机读写函数

4.1 fseek

4.2 ftell

4.3 rewind

五、判定文件读取结束的标准与读写文件中途发生错误的解决办法

5.1 判定文件读取结束的标准

5.2 函数ferror与feof

5.2.1 函数ferror

5.2.2 函数feof 


在上一章中,我们主要介绍了文件类型指针如何打开与关闭文件什么是流与标准流,以及提到的部分顺序读写函数

C语言| 文件操作详解 (一)

这篇文章为上篇文章的续,将对有关文件随机读写的函数 fseek、ftell 、rewind 进行介绍,并解释判定文件读取结束的标准与读写文件中途发生错误的解决办法

四、有关文件的随机读写函数

4.1 fseek

介绍:该函数主要用于改变文件中光标(就是我们打字的时候一闪一闪的小竖线)的位置,(这里说光标是为了便于理解,实际上是文件指针),再利用相关函数输入内容后,新内容会覆盖在该位置上的原内容。

例如,在打开的某个文件中有以下内容:“abcdef”,其中光标在‘c’之后(即相对于文件起始光标位置,偏移量为3),此时利用fputc在文件上打印一个字母m,则文件内容最终变为“abcmef”。

函数声明:

int  fseek ( FILE* stream,long int offset,int origin );

参数:

(1) 指向标识输入流的FILE对象的指针;

(2) 要从源偏移的字节数,即偏移量;

(3) 偏移量所参考的起始位置,即源的值;

对于参数(3),源的位置值,我们一般填入下表中三个常量的一个。

常量参考位置
SEEK_SET文件开头
SEEK_CUR文件指针的当前位置
SEEK_END文件末尾

返回值:

成功则返回0,否则返回非0值;如果发生读取或写入错误,则会设置错误指示符。

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("233.txt", "w");fputs("There has a boy", pf);fseek(pf, 12, SEEK_SET);fputc('g', pf);fputc('i', pf);fputc('r', pf);fputc('l', pf);fclose(pf);return 0;
}

4.2 ftell

介绍:该函数用于返回文件指针相对于起始位置的偏移量。

函数声明:

long int ftell ( FILE * stream ) ;

参数:

指向标识流的FILE对象的指针

返回值:

成功则返回相对于文件指针初始位置的偏移量,失败则返回-1L;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("example.txt", "rb");long long size = 0;if (pf == NULL)perror("Error opening file");else {fseek(pf, 0, SEEK_END);size = ftell(pf);fclose(pf);printf("该文件的大小为%ld字节\n",size);}return 0;
}

PS:

顺便解释一下为什么上述代码可以检测文件的字节大小,因为一个字符占一个偏移量,只要得到文件末尾相对于文件初始位置的偏移量 ,就可以得到文件的字符数,而一个字符占一个字节(char型),所以可以得到文件的字节大小。

4.3 rewind

介绍:该函数用于将文件指针的位置重置为文件的起始位置

函数声明:

void rewind ( FILE * stream ) ;

参数:

指向标识流的FILE对象的指针

返回值:

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("123456.txt", "w+");char arr[100];fputs("fufu is very cute!", pf);rewind(pf);fgets(arr,sizeof(arr)/sizeof(arr[0]), pf);printf("%s",arr);fclose(pf);return 0;
}

五、判定文件读取结束的标准与读写文件中途发生错误的解决办法

5.1 判定文件读取结束的标准

如何判断文件读取结束?其实是一个很简单的问题。

一般来说,我们使用的有关文件读取的函数,对于文本文件,如果它的返回值是EOF(例如fgetc),或者NULL(例如fgets),则代表文件内容读取结束。

而如果是二进制文件,则是看返回值是否小于实际要读取的个数(例如fread)

5.2 函数ferror与feof

但有些时候,文件会因为各种各样的代码问题导致文件中途读写失败,如何得知哪个函数出现问题,又如何判断文件是否因为到达文件尾而读取结束?接下来我们介绍两个函数,它们可以解决我们的疑问。

5.2.1 函数ferror

函数声明:

int ferror( FILE* stream );

函数参数:

指向标识流FILE对象的指针

返回值:

如果设置了与流关联的错误指示器,则返回非零值,否则返回0

解释:

在上篇文章与这篇文章中我们介绍的函数,绝大多数遇到错误,都会设置错误指示器,如果在每一个有关文件读写的函数后面都加一个if利用ferror进行判断,就可以知道在哪里出了问题。

例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf;pf = fopen("myfile.txt", "r+");//注释if (pf == NULL) perror("Error opening file");else {char a=fgetc(pf);if (ferror(pf)) {printf("Error Reading to myfile.txt\n");exit(3);}fputc('x', pf);if (ferror(pf)) {printf("Error Writing to myfile.txt\n");exit(2);}          fclose(pf);}return 0;
}

 我们先将代码复制到工程中,然后在工程文件的目录下创建名为“myfile”的txt类型文件,并输入如下内容:

1.如果将注释一行的“r+”更改为“r”,运行程序,结果为:

2. 如果将注释一行的“r+”更改为“w”,运行程序,结果为:

根据ferror函数与运行结果, 我们就可以锁定问题出现在文件的读写方式上。

3. 如果不进行更改,运行程序,结果为:

5.2.2 函数feof 

函数声明:

int feof ( FILE* stream);

参数:

指向标识流的FILE对象的指针

返回值:

如果设置了与流关联的文件结束指示器,则返回非零值,否则,返回0

解释:

如果正常到达文件末尾而结束读取,则会返回非0值,如果未到达文件末尾而结束读取,则会返回0,用于检查程序是否读取完整。

注意:

feof是用于判断文件读取结束的原因是否是到达文件末尾,千万不可在文件读取过程中使用feof!

例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main ()
{FILE * pFile;int n = 0;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{while (fgetc(pFile) != EOF) {++n;}if (feof(pFile)) {puts ("End-of-File reached.");printf ("Total number of bytes read: %d\n", n);}else puts ("End-of-File was not reached.");fclose (pFile);}return 0;
}

此代码作用为:

打开名为“myfile.txt”的文件,并通过逐个读取所有字符来计算文件的字节数。该程序检查是否已到达文件末尾,如果已到达,则打印读取的总字节数。

小伙伴们可以自己试一下,我这里就不演示了。

本文完!

相关文章:

C语言| 文件操作详解(二)

目录 四、有关文件的随机读写函数 4.1 fseek 4.2 ftell 4.3 rewind 五、判定文件读取结束的标准与读写文件中途发生错误的解决办法 5.1 判定文件读取结束的标准 5.2 函数ferror与feof 5.2.1 函数ferror 5.2.2 函数feof 在上一章中&#xff0c;我们主要介绍了文件类型…...

保证项目如期上线,测试人能做些什么?

要保证项目按照正常进度发布&#xff0c;需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下&#xff0c;测试团队如何保证项目按期上线&#xff0c;以及在这个过程中可能…...

【杂谈】在大学如何学得计算机知识,浅谈大一经验总结

大学新生的入门经验简谈 我想在学习编程这条路上&#xff0c;很多同学感到些许困惑&#xff0c;摸爬滚打一年&#xff0c;转眼就要进入大二学习了&#xff0c;下面浅谈个人经验与反思总结。倘若说你是迷茫的&#xff0c;希望这点经验对你有帮助&#xff1b;但倘若你有更好的建…...

Superset二次开发之柱状图实现同时显示百分比、原始值、汇总值的功能

背景 柱状图贡献模式选择行,堆积样式选择Stack,默认展示百分比,可以展示每个堆积的百分比,但是无法实现同时展示百分比、原始值、汇总值的效果。借助Tooltip可以实现,但是不直观。 柱状图来自Echarts插件,可以先考虑Echarts的柱状图如何实现此需求,再研究Superset项目的…...

堆的创建和说明

文章目录 目录 文章目录 前言 小堆&#xff1a; 大堆&#xff1a; 二、使用步骤 1.创建二叉树 2.修改为堆 3.向上调整 结果实现 总结 前言 我们已经知道了二叉树的样子&#xff0c;但是一般的二叉树是没有什么意义的&#xff0c;所以我们会使用一些特殊的二叉树来进行实现&a…...

【玩转python】入门篇day14-函数

1、函数的定义 函数通过def定义&#xff0c;包括函数名、参数、返回值 # 定义函数 def test(a,b): # a,b表示形式参数print(a b)#函数体(具体的功能)return a*b #返回值# 函数调用 test(12,43) # 12和43表示实际参数,在调用函数时,会替换形式参数a,b下面这个展示了稍微复…...

uni-app 将base64图片转换成临时地址

function getTempFilePath(base64Data) {return new Promise((resolve, reject) > {const fs uni.getFileSystemManager()base64Data base64Data.split(,)[1]const fileName temp_image_ Date.now() .png // 自定义文件名&#xff0c;可根据需要修改const filePath un…...

C#用Socket实现TCP客户端

1、TCP客户端实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks;namespace PtLib.TcpClient {public delegate void Tcp…...

jmeter-beanshell学习15-输入日期,计算前后几天的日期

又遇到新问题了&#xff0c;想要根据获取的日期&#xff0c;计算出前面两天的日期。网上找了半天&#xff0c;全都是写获取当天日期&#xff0c;然后计算昨天的日期&#xff0c;照葫芦画瓢也没改出来想要的&#xff0c;最后求助了开发同学。 先放上网上获取当天&#xff0c;计…...

Zabbix 7.0 安装

在zabbix官网中有着比较完善的安装步骤&#xff0c;针对不同的系统都有。可以直接按照举例说明进行安装。本文只是针对其提供的安装步骤进行一些说明解释补充。 安装环境 操作系统版本&#xff1a;AlmaLinux 9.4&#xff08;10.10.20.200&#xff09;zabbix版本&#xff1a;7.…...

软考高级-系统架构设计师

2024广东深圳考试时间 报考人员可登录中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn&#xff09;进行网上报名&#xff0c;报名前须扫码绑定个人微信&#xff0c;不允许代报名。 上半年考试报名信息填报时间&#xff1a;2024年3月25日9:00&#xff0d;4月2日…...

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述...

大数据技术原理-spark的安装

摘要 本实验报告详细记录了在"大数据技术原理"课程中进行的Spark安装与应用实验。实验环境包括Spark、Hadoop和Java。实验内容涵盖了Spark的安装、配置、启动&#xff0c;以及使用Spark进行基本的数据操作&#xff0c;如读取本地文件、文件内容计数、模式匹配和行数…...

第四范式上线搜广推一体化平台 赋能企业高效增长

产品上新 Product Release 今天&#xff0c;第四范式产品再度上新&#xff0c;正式升级并推出的“搜广推”一体化平台——天枢。 天枢拥有全面的用户画像分析、端到端的搜索推荐一体化、一站式流量运营管理等能力&#xff0c;集合智能搜索、智能推荐和智能推广三大能力于一身&a…...

智能小程序 Ray 开发面板 SDK —— 智能设备模型通用能力一键执行 SDK 汇总(一)

getTapToRunRules 描述 查询当前家庭下可绑定的一键执行列表&#xff0c;会去掉失效或自动化规则。 请求参数 参数数据类型说明是否必填devIdstring设备 ID&#xff0c;默认从设备环境中取否gidstring家庭 ID&#xff0c;默认从当前家庭中取否containStandardZigBeeboolean…...

特大喜讯:我的作品被河北某大学选做教材

...

将时间用于符合当下的未来思考——读《纳瓦尔宝典》

在财富积累的篇章中&#xff0c;倡导的核心理念是“不要通过出租时间来赚取收入”。沿着这条道路&#xff0c;可以通过以下智慧指引来避免不必要的迂回&#xff1a;首先&#xff0c;不要让自己深陷于日常的琐碎事务中&#xff0c;而应以开阔的心胸去探索和吸收新的知识。其次&a…...

CentOS-Stream-9仿冒Rocky-9通过Kolla-ansible部署OpenStack 2024.1

CentOS-Stream-9仿冒Rocky-9通过Kolla-ansible部署OpenStack 2024.1 OpenStack及Kolla项目的最新稳定版产品不再提供对CentOS-Stream-9的容器镜像支持&#xff0c;但考虑到 Rocky-9对RHEL/CentOS-Stream-9进行了binary级别的兼容&#xff0c;因此在CentOS-Stream-9上仿冒Rocky…...

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 目录 支持向量机算法介绍 练习题 Python代码与分析 支持向量机和朴素贝叶斯的联系 支持向量机算法介绍 支持向量机&#…...

秒懂Linux之自动化构建工具-make/Makefile

目录 一.前文摘要 二.make/Makefile 一.前文摘要 在学习自动化构建工具前我们先来补充一下动静态库的相关指令 动态库指令 gcc -o 文件&#xff08;重命名&#xff09; 源文件 静态库指令 gcc -o 文件&#xff08;重命名&#xff09; 源文件 -static 二.make/Makefile 怎么形…...

.net core + vue 搭建前后端分离的框架

目录 步骤一&#xff1a;创建.NET Core后端项目 步骤二&#xff1a;创建Vue.js前端项目 步骤三&#xff1a;集成后端和前端项目 步骤一&#xff1a;创建.NET Core后端项目 安装.NET Core SDK&#xff1a; 确保你的开发环境中已安装了最新版本的.NET Core SDK。你可以从 .NET …...

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVMGFS 分布式存储系统构建 KVM 高可用 案例分析 案例概述 使用 KVM 及 GlusterFS 技术&#xff0c;结合起来实现 KVM 高可用利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余 分布式复制卷 主要用于需要冗余的情况下把一个文件存放在两个或两个…...

centos安装mysql 5.7版本

因为要继续第二阶段的学习&#xff0c;windows里面的mysql版本&#xff0c;很多设置没有。因此弄了一个虚拟机&#xff0c;安装了centos&#xff0c;在里面安装mysql。 看了《centos安装mysql 5.7版本》里面有设置my.cnf文件&#xff0c;这个在虚拟机里面编辑&#xff0c;手动敲…...

SQL——查询sql执行顺序

在SQL查询中&#xff0c;虽然我们在编写查询时遵循一定的逻辑顺序&#xff08;SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY&#xff09;&#xff0c;但实际上&#xff0c;数据库在执行这些查询时遵循的是不同的物理执行顺序。这个物理执行顺序是数据库管理系统&#xff0…...

钉耙编程(3)

1001深度自同构 Problem Description 对于无向图中的点&#xff0c;定义一个点的度为与其相连的边的条数。 对于一棵有根树&#xff0c;定义一个点的深度为该点到根的距离。 对于由若干有根树构成的森林&#xff0c;定义该森林是深度自同构的&#xff0c;当且仅当森林中任意…...

python 线程池处理文件

使用多线程来加速文件复制的过程&#xff0c;可以使用Python的concurrent.futures模块中的ThreadPoolExecutor。代码如下&#xff1a; import glob import os import shutil from concurrent.futures import ThreadPoolExecutordef copy_image(image):imagepath image.replace…...

AI技术和大模型对人才市场的影响

012024 AI技术和大模型 2024年AI技术和大模型呈现出多元化和深入融合的趋势&#xff0c;以下是一些关键的技术方向和特点&#xff1a; 1. 生成式AI 生成式AI&#xff08;Generative AI&#xff09;在2024年继续快速发展&#xff0c;它能够创造全新的内容&#xff0c;而不仅仅…...

解释“location”和“position”

Explanation of “Location” and “Position” Location and position are terms often used interchangeably in everyday language, but they can have distinct meanings depending on the context. Below, we explore their definitions, differences, and examples of u…...

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理&#xff0c;和NIO里ByteBuffer区别&#xff1f; Java NIO 提供了ByteBuffer 作为它 的字节容器&#xff0c;但是这个类使⽤起来过于复杂&#xff0c;⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类&#xff0c;专门设计来处理字节数据&#xff0c;…...

芋道以开源之名行下作之事 恬不知耻 标榜自己开源 公开源码+sql 不用再加入知识星球

资源 链接: https://pan.baidu.com/s/1TeuxbAUfLQ5_BqMBF1kniQ?pwdcqud 提 取码: cqud 依次为后端、补充版的sql、前端 此文档内安装部署等一应俱全...

英文网站制作注意点/网站统计数据

1.明确哪些代码是多线程代。 2.明确共享数据。 3.明确多线程运行代码中哪些语句是操作共享数据的。 synchronized作为修饰符放函数上。同步函数使用的锁是&#xff1a;this验证&#xff1a;开启两个线程&#xff0c;一个同步代码块&#xff0c;一个同步函数。 class Ticket …...

曹县住房和城乡建设局网站/百度学术论文查重官网

作者&#xff1a;Cary G.Gray and David R. Cheriton 1989 译者&#xff1a;phylipsbmy 2011-5-7 出处&#xff1a;http://duanple.blog.163.com/blog/static/70971767201141111440789/ [ 序&#xff1a;所谓租约(leases)&#xff0c;其实就是一个合同&#xff0c;即服务端给予…...

郑州网站建设公司招聘/网站优化搜索排名

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.open-open.com/lib/view/open1442664464415.html 转载于:https://my.oschina.net/fltsp/blog/620264...

wordpress为什么放弃/怎么让关键词快速排名首页

关于C&#xff0c;hanoi塔的递归问题一直是个经典问题&#xff0c;我们学习数据结构的时候也会时常用到&#xff0c; 因为它的时间复杂度和空间复杂度都很高&#xff0c;我们在实际的应用中不推荐使用这种算法&#xff0c;移动n个盘子&#xff0c; 需要2的n次幂减一步&#xff…...

mip网站案例/做推广网络

1、行列式的本质是线性变换的放大率&#xff0c;而矩阵的本质就是个数表。 2、行列式行数列数&#xff0c;矩阵不一定&#xff08;行数列数都等于n的叫n阶方阵&#xff09;&#xff0c;二者的表示方式亦有区别。 3、行列式与矩阵的运算明显不同 &#xff08;1&#xff09; 相…...

东营今日新闻/邯郸seo优化

毫无疑问&#xff0c;AI&#xff08;人工智能&#xff09;已成为了科技巨头保持领先、开拓新机会的核心要素之一。目前&#xff0c;无论是巨头还是创业公司都在积极理解AI&#xff0c;那马化腾先生是如何看待AI领域目前的发展&#xff1f; 为什么要关注AI 去年AlphaGo打赢了人类…...