文件操作(2)【文件的随机读写】【文件读取结束的判定】

一.文件的随机读写

1.fseek函数

这个函数可以根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。有三个参数:

  • stream:文件指针,指向要设置位置的文件。
  • offset:偏移量,可以为正数、负数或0。正数表示向文件末尾偏移,负数表示向文件开头偏移,0表示从文件开头偏移。
  • origin:起始位置,可以取下面的值:
    • SEEK_SET:从文件开头开始偏移。
    • SEEK_CUR:从当前位置开始偏移。
    • SEEK_END:从文件末尾开始偏移。
#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return 1;}//fputs("abcdefghi", pf);int ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 4, SEEK_CUR);//fch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

当我把第一个字符a给读取出来后,光标就移动到了b的位置,但是我这里使用了fseek,SEEK_CUR是从当前位置开始,偏移量为4,直接走到了f这里。如果是用另外两中的话,只需要改变偏移量就可以随便读取我们想要的地方。

2.ftell函数

这个函数可以返回相对于起始位置的偏移量。

还是用上面的代码

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return 1;}//fputs("abcdefghi", pf);int ch = fgetc(pf);//afseek(pf, 4, SEEK_CUR);//fprintf("%d", ftell(pf));fclose(pf);pf = NULL;return 0;
}

打印出来的就是5。

因为此时光标的位置在f的位置。

3.rewind函数

这个函数可以让文件指针的位置回到文件的起始位置。

还是上面的代码。

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return 1;}//fputs("abcdefghi", pf);int ch = fgetc(pf);//afseek(pf, 4, SEEK_CUR);//frewind(pf);//回到起始位置ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

打印出来的就还是a

二.文件读取结束的判定

feof函数和ferror函数

关于这个函数其实被许多人都给用错了,在文件读取的过程中不能用feof的返回值判断文件是否结束。

它的作用是:当文件读取结束后,判断读取结束的原因是否是:遇到文件末尾结束。

也就是说,文件现在读取结束了,但是是什么原因结束的呢?1.遇到文件末尾——feof。2.读取时发生了错误——ferror。

当我们打开一个流的时候,这流上有两个标记值:1.是否遇到文件末尾。2.是否发生错误了。假如在读取的过程中真的遇到了这两种情况,就会把这两个标记给设置一下。而feof是检测是否遇到文件末尾的,ferror则是检测是否发生了错误。

比如fgetc函数在读取到文件末尾或者遇到错误会返回EOF。fgets函数在读取到文件末尾或者错误的时候会返回NULL。但是我们怎么知道是哪一种情况,导致它们返回了这样的值呢?

它返回非零值(通常为1)表示有错误发生,返回0表示没有错误发生。

当文件指针指向的文件已经到达文件末尾时,feof函数返回非零值;否则,返回零。

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL)//文本里面是abcdefghi{perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c\n", ch);}if (feof(pf)){printf("遇到文件末尾,正常结束");}else if (ferror(pf)){perror("fgetc");}fclose(pf);pf = NULL;return 0;
}

这里是正常结束,当然还有错误的情况。

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL)//文本里面是abcdefghi{perror("fopen");return 1;}//int ch = 0;//while ((ch = fgetc(pf)) != EOF)//{//	printf("%c\n", ch);//}char c = 0;for (c = 'a'; c <= 'z'; c++){fputc(c,pf);}if (feof(pf)){printf("遇到文件末尾,正常结束");}else if (ferror(pf)){perror("fgetc");}fclose(pf);pf = NULL;return 0;
}

这里我是用"r"来读取文件,但是我用了fputc函数,非要往文件里面写肯定是错误的了。

三.文件缓存区

ANSIC标准采用“缓冲文件系统”处理数据文件,所谓缓冲文件系统是指系统系统自动的在内存中为程序中每一个正在使用的文件开辟一块文件缓冲区,从内存向磁盘输出数据会先送到文件缓冲区,等装满缓冲区的时候再一起送到磁盘里面去,如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个的将数据送到程序数据区(程序变量等)。

到这里差不多文件操作都差不多结束了。感谢大家的观看,如有错误,还请大家多多指正。

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

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

相关文章

Vue3:用Pinia的storeToRefs结构赋值store数据

一、情景描述 我们学习了Pinia之后&#xff0c;知道&#xff0c;数据是配置在Pinia的state里面的。 那么&#xff0c;如果有多个字段需要取出来使用&#xff0c;并且不丢失数据的响应式&#xff0c;如何优雅的操作了&#xff1f; 这里就用到了Pinia的storeToRefs函数 二、案…

三角形最小路径和

题目链接 三角形最小路径和 题目描述 注意点 -10000 < triangle[i][j] < 10000triangle[i].length triangle[i - 1].length 1triangle[0].length 1 解答思路 由题意得&#xff0c;到达任意第i层第j个节点的路径和一定是由第i - 1层第j - 1或第j个节点到达&#x…

JavaScript高级应用

学习作用域、变量提升、闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0c;降低代码的冗余度。 理解作用域对程序执行的影响 能够分析程序执行的作用域范围 理解闭包本质&#xff0c;利用闭包创建隔离作用域 了解…

直方图均衡化的本质

Rafael C. Gonzalez “Digital Image Processing”的错误 直方图均衡化的本质是灰度级分布的近邻映射&#xff0c;这部分的内容全错。总有些人崇洋媚外。 我修改了相关的内容&#xff0c;参阅禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程…

如何召开一次创意十足的OKR头脑风暴会?

召开一次创意十足的OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;头脑风暴会&#xff0c;是激发团队成员智慧、明确共同目标并落实关键行动的重要环节。下面将详细列举召开此类头脑风暴会的具体步骤&#xff0c;以确保会议达到预期效果。 …

Outlook会议邀请邮件在答复后就不见了

时常会有同事找到我说&#xff0c;Outlook答复会议邀请邮件后收件箱就找不到会议邀请的邮件了。 这其实是Outlook的的一个机制&#xff0c;会把应答后的会议邀请邮件从收件箱自动删除&#xff0c;到已删除的邮件那里就能找到。如果不想要自动删除&#xff0c;改一个设置即可。…

HarmonyOS 应用开发之自定义组件的自定义布局

如果需要通过测算的方式布局自定义组件内子组件的位置&#xff0c;建议使用以下接口&#xff1a; onMeasureSize&#xff1a;组件每次布局时触发&#xff0c;计算子组件的尺寸&#xff0c;其执行时间先于onPlaceChildren。 onPlaceChildren&#xff1a;组件每次布局时触发&…

【Python学习】—Python常见的面试题

【Python学习】—Python常见的面试题 1、一个变量没有定义报什么错误 一般在 python 中会有红色的波浪线标出来要是运行后&#xff0c;就直接会报变量没定义的错&#xff1a;NameError&#xff1a; name’i’ is not defined 2、 列表与元组的区别 他们最大的区别 列表可以…

[游戏开发]Unreal引擎知识

工程通常会选择Development_Editor模式&#xff0c;它会过滤掉很多Debug信息&#xff0c;开发期间占用内存更小&#xff0c;项目运行更流畅&#xff0c;但也有缺点&#xff0c;就是部分断点信息看不到&#xff0c; 有两种解决办法&#xff1a; 1&#xff0c;选择DebugGame_Ed…

树与二叉树的应用试题

01&#xff0e;在有n个叶结点的哈夫曼树中&#xff0c;非叶结点的总数是( A ). A. n-1 B. n C. 2n-1 D.2n解析&#xff1a;哈夫曼树中只有度为0和2的结点&#xff0c;在非空二…

相关滤波跟踪算法-CSK

0. 写在前面 对相关滤波算法综述比较强的文档&#xff1a; NIUBILITY的相关滤波框架详解 - 知乎 (zhihu.com) 1. 概述 相关滤波算法问世之前&#xff0c;跟踪算法饱受运行时间的困扰&#xff0c;直到MOSSE算法出现&#xff0c;直接将算法速度提到了615fps&#xff0c;第一次将…

9proxy—数据采集工具全面测评

9Proxy数据采集工具Unlock the web with 9Proxy, the top residential proxy provider. Get unlimited bandwidth, affordable prices, and secure HTTPS and Socks5 configurations.https://9proxy.com/?utm_sourceblog&utm_mediumcsdn&utm_campaignyan 前言 在当今数…

2024年04月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年04月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

利用Flutter的混淆工具保护应用代码安全

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

我的C++奇迹之旅:值和引用的本质效率与性能比较

文章目录 &#x1f4dd;引用&#x1f320;引用概念&#x1f309;引用特性 &#x1f320;使用场景&#x1f309;做参数&#xff08;传值与传地址&#xff09;&#x1f309;传值、传引用效率比较 &#x1f320;引用做返回值&#x1f309;引用和指针的区别 &#x1f320;常引用&am…

苹果开发者账号注册步骤中的常见疑问解答与技巧分享

转载&#xff1a;注册苹果开发者账号的方法 在2020年以前&#xff0c;注册苹果开发者账号后&#xff0c;就可以生成证书。 但2020年后&#xff0c;因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号&#xff0c;所以需要缴费才能创建ios证书了。 所以新政策出…

蓝桥杯-单片机基础12——对芯片LM555产生的频率脉冲计数思路

蓝桥杯单片机组备赛指南请查看 &#xff1a;本专栏第1篇文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K61S2 &#xff08;使…

如何在CentOS安装StackEdit Markdown编辑器并实现无公网IP远程访问使用

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安…

反射的学习

反射的作用&#xff1a; 1.获取一个类里面的所有信息&#xff0c;获取到之后&#xff0c;在执行其他的业务逻辑 2.结合配置文件&#xff0c;动态的创建对象并调用方法

(4)(4.5) Underwater Sonar (Analog)

文章目录 前言 1 推荐硬件 2 连接和配置 3 参数说明 前言 本页详细介绍了低成本模拟水下声纳&#xff08;又称"探鱼器"&#xff09;和数字转换器的设置&#xff0c;数字转换器可将模拟读数转换成 NMEA 0183&#xff0c;供 ardupilot 读取。这种设置可以测量船下…