【超详细文件操作(三)】C语言

作者:日出等日落

专栏:C语言

只有流过血的手指,才能弹出世间的绝唱。                                                        ——泰戈尔

 

目录

 1.文件的随机读写

 1.1  fseek函数

1.1.1 下面使用fseek函数

1.2  ftell函数

 1.3  rewind函数

 2 . 文本文件和二进制文件 

3 . 文件读取结束的判定

被错误使用的feof:


 

 1.文件的随机读写

前面我们讲了文件顺序读写的相关函数与操作,现在,我们来谈论一下怎么样才能随机读写;

 1.1  fseek函数

  功能: 根据文件指针的位置和偏移量来定位文件指针。

  • 参数:第一个参数是文件指针,第二个参数是偏移量,第三个参数是起始位置 (如下)
  • 头文件:#include<stdio.h>

 

  •  第三个参数有三种情况:
  1. 文件开头
  2. 文件的当前位置
  3. 文件的末尾

下面我来为大家解释一下: 

首先,我这里是先创建一个text.txt文件,以便后续的操作,文件中存放了abcdef数据;

 

 

int main()
{
	FILE*pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	/*读文件*/
	int ch = fgetc(pf);
	printf("%c\n", ch);


	ch = fgetc(pf);
	printf("%c\n", ch);

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

刚开始读文件的时候,fgetc获取的是字符的首地址,也就是第一个字符a,当再次使用fgetc函数的时候,他会自动往后挪动一个位置;

运行结果:

 

1.1.1 下面使用fseek函数

代码示例1:

int main()
{
	FILE*pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	fseek(pf, 3, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);//d


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

这里使用 文件开头的参数SEEK_SET,偏移量是3,意思是从文件的开头偏移3个位置获取字符。

运行结果:

 

 代码示例2:

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

	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);

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

 这里使用文件末尾参数SEEK_END,偏移-3个偏移量,意思是从文件的末尾往回偏移3个位置获取字符。

运行结果:

 

代码示例3:


int main()
{
	FILE*pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	/*读文件*/
	int ch = fgetc(pf);
	printf("%c\n", ch);//a
	fseek(pf, 2, SEEK_CUR);

	ch = fgetc(pf);
	printf("%c\n", ch);//d

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

这里使用文件当前位置参数SEEK_CUR,偏移2个偏移量,意思是从文件的当前位置偏移2个位置获取字符。

运行结果:

 

1.2  ftell函数

功能:返回文件指针相对于起始位置的偏移量

 代码示例:
 

int main()
{
	FILE*pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	/*读文件*/
	int ch = fgetc(pf);
	printf("%c\n", ch);//a
	fseek(pf, 2, SEEK_CUR);

	ch = fgetc(pf);
	printf("%c\n", ch);//d

	int pos = ftell(pf);
	printf("%d\n", pos);

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

 这里我们刚开始使用fgets获取了一个字符a,那么他就会自动向后移动一个位置,这时的地址就会指向b,然后使用fseek函数从当前位置偏移2个位置,这是输出的是d,但是他在使用过后,它会自动往后移动一个字符,所以,再次调用ftell函数返回文件指针相对于起始位置的偏移量时就是4,就是字符e到起始位置a。

运行结果:

 

 1.3  rewind函数

功能:让文件指针的位置回到文件的起始位置

  代码示例:

int main()
{
	FILE*pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	/*读文件*/
	int ch = fgetc(pf);
	printf("%c\n", ch);//a
	fseek(pf, 2, SEEK_CUR);

	ch = fgetc(pf);
	printf("%c\n", ch);//d

	int pos = ftell(pf);
	printf("%d\n", pos);


	rewind(pf);
	
	ch = fgetc(pf);
	printf("%c\n", ch);//a


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

 

运行结果:

 

我们接着往下使用rewind函数,他会让文件指针的位置回到文件的起始位置

 

 2 . 文本文件和二进制文件 

  • 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
  • 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
  • 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文 本文件。
  • 一个数据在内存中是怎么存储的呢?
  • 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

 

 测试用例:

#include <stdio.h>
int main()
{
 int a = 10000;
 FILE* pf = fopen("test.txt", "wb");
 fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
 fclose(pf);
 pf = NULL;
 return 0;
}

 运行结果:

 

这就是二进制文件,我们看不懂

 

3 . 文件读取结束的判定

被错误使用的feof:

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:

fread判断返回值是否小于实际要读的个数。

  • fgetc

如果读取正常,会返回读取到的字符的ASCII值
如果读取失败,返回EOF

  • fgets

如果读取正常,返回的是存放读取到的数据的地址
如果读取失败,返回的NULL

  • fscanf

如果读取正常,返回的是格式串中指定的数据的个数
如果读取失败,返回的是小于格式串中指定的数据的个数

 

 

欢迎大佬们指点!!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码分析-Bean创建流程三

目录 一、 列举一些创建对象有哪几种方式 二、自定义BeanPostProcess生成代理对象 1、实战案例 2、源码分析 三、通过supplier创建对象 1、实战案例 2、源码分析 四、通过FactoryMethod创建对象 1、实战案例 2、源码分析 五、小总结 一、 列举一些创建对象有哪几种方…

作为一个女测试员是什么样的体验?

面试时极度紧张&#xff0c;语无伦次&#xff0c;觉得肯定没戏&#xff0c;最后却拿到高薪offer。 工作之后我听同事们讲&#xff0c;测试总监面试官并没打算要我&#xff0c;但身边的人都问他&#xff1a; 那个小姐姐什么时候来报道&#xff1f;... 于是在众人的期待的目光…

撮合交易系统简介

1 撮合交易系统简介 金融市场&#xff1a; 为了应对更高峰值的成交量&#xff0c;国内各金融机构&#xff0c;主要是交易所和银联、中心之间需求越来越多&#xff1a; 其中最重要的就是撮合系统&#xff1a; 系统拓扑图&#xff1a; 委托终端/柜台&#xff1a; 网关&#xff1…

一四三、人脸识别自动点赞、关注

文章目录脚本功能获取video当前播放帧图片将图片传到后台调用百度人脸识别接口拿到识别结果处理逻辑效果展示问题记录脚本功能 通过获取video当前播放帧图片&#xff0c;截图调用后台接口&#xff0c;再调用百度人脸识别拿到人脸信息&#xff08;年龄、颜值、性别等&#xff09…

元宇宙医生虚拟形象提高远程医疗服务质量

与现实中不同&#xff0c;3D虚拟形象是由个人在数字空间中自由选择并进行扮演的。这种3D虚拟形象在元宇宙中的重要性越来越突出。 在元宇宙虚拟空间中&#xff0c;用户借助元宇宙3D虚拟形象就能与其他用户互动、交流并获得真实的沉浸式体验&#xff0c;因此能广泛融入各种生活、…

「解析」牛客网-华为机考企业真题 41-60

又是一年春招时&#xff0c;有幸收到华为自动驾驶算法岗&#xff0c;之前刷题不多&#xff0c;在此汇总下牛客网的真题&#xff0c;主要采用Python编写&#xff0c;个人觉得语言只是实现工具而已&#xff0c;并不是很关键&#xff0c;Python简洁易懂&#xff0c;更加适合算法工…

基于EB工具的TC3xx_MCAL配置开发06_PWM模块配置

目录 1.概述2. EB配置2.1 PWM->General2.2 PWM->Channel2.2.1 PWMChannel配置2.2.2 PwmChannelClass配置2.2.3 GTM通道选取2.3 MCU关联配置2.4 Port关联配置1.概述 本篇开始我们基于EB Tresos工具对英飞凌TC3xx系列MCU的MCAL开发进行介绍,结合项目经验对各MCAL外设的开…

Docker:关于 Dockerfile 编写优化的一些笔记整理

写在前面 分享一些 Dickerfile 构建镜像优化方式的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#…

【React全家桶】Flux与Redux

&#x1f39e;️&#x1f39e;️&#x1f39e;️ 博主主页&#xff1a; 糖 &#xff0d;O&#xff0d; &#x1f449;&#x1f449;&#x1f449; react专栏&#xff1a;react全家桶 &#x1f339;&#x1f339;&#x1f339;希望各位博主多多支持&#xff01;&#xff01;&a…

javaScript扫雷

文章目录一、准备工作1.图片2.html2.css3.js二、初始化数据1. 配置文件2.工具文件3.逻辑文件1.main函数2.init函数1.随机生成雷2.css添加三、完整代码1.html2.js3.css一、准备工作 1.图片 需要找三张图片 旗子的图片 炸弹的图片 爆炸的图片 2.html html文件夹新建一个html文…

区块链基本原理

区块链的起源 创始者介绍 姓名&#xff1a;中本聪&#xff08;英语&#xff1a;SatoshiNakamoto&#xff09;&#xff0c;自称日裔美国人&#xff0c;日本媒体常译为中本哲史&#xff0c;此名是比特币协议及其相关软件Bitcoin-Qt的创造者&#xff0c;但真实身份未知。 中本聪于…

Chapter9.1:线性系统状态空间基础(上)

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

解决Visual Studio设置C++标准 但是_cplusplus始终为199711

目录场景复现Visual Studio官方说明C标准对应表解决方案方法一 恢复__cplusplus宏方法二 使用_MSVC_LANG宏场景复现 我在VS2022偶然的一次测试C标准开发环境&#xff0c;发现无论我怎么修改C语言标准&#xff0c;输出的__cplusplus宏总是199711。 Visual Studio官方说明 链…

【C++】vector模拟实现及其应用

文章目录vector的介绍vector的使用及其实现vector的定义vector iterator 的使用vector空间增长问题vector的增删查改vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素…

开源 Swallow 代码审计系统体验

最近在哔哩哔哩看 到Swallow 代码审计系统的宣传,发现功能比较适合我目前的工作需要,安装使用了一下,简单做了一个笔记,分享给有需要的朋友. 底层架构为蜻蜓编排系统,墨菲SCA,fortify,SemGrep,hema 项目地址:https://github.com/StarCrossPortal/swallow 安装与使用视频教程:ht…

hexo 搭建个人博客记录

看B站的程序羊的关于搭建hexo博客的方法自己搭了一个博客&#xff0c;链接是 手把手教你从0开始搭建自己的个人博客 |无坑版视频教程| hexo 下面就视频所讲做做笔记&#xff0c;以后可以回来查看&#xff0c;推荐小伙伴想搭建hexo博客的可以去看看这个视频。 1. 安装Node.js…

react项目路由组件懒加载和路由传值方式

项目实战 使用useRoutes配置路由&#xff0c;结合插槽配置用户登录检测。 用户登录成功进入login 直接系统主界面 路由模块抽离 整体代码外移 { path: "/admin", element: ( <Author name"admin"> <Index /> </Author> ), }, { path:…

「SAP ABAP」OPEN SQL(七)【GROUP BY | HAVING | ORDER BY】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

基于matlab已知地球两点坐标求取距离和方位角函数distance

一、语法1.语法1[arclen,az] distance(lat1,lon1,lat2,lon2)&#xff1b;R6371.393; % 地球半径&#xff0c;单位&#xff1a;km地点1&#xff08;维度lat1&#xff0c;经度lon1&#xff09;&#xff0c;地点2&#xff08;维度lat2&#xff0c;经度lon2&#xff09;假设地点1和…

001 鸿蒙系统环境搭建及运行hello world

1 下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本…