文件操作(2)(C语言版)

文件的随机读写:

fseek函数:

前面讲解了顺序读写的相关函数,这里介绍一些可以“指哪写哪的函数”

有三个参数:

1、文件的地址

2、相对于第三个参数origin偏移的位置

3、起始位置(有三种)

第一种:SEEK_SET(开头)

第二种:SEEK_CUR(当前位置)

第三种:SEEK_END(结尾)

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);

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

可以通过fseek改变光标位置,而且是覆盖改写

什么意思呢?

如以下代码:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);
	fseek(pf, 2, SEEK_SET);//从头开始往后两个位置
	fputs("aa", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

还可以这样改:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);
	fseek(pf, 2, SEEK_SET);//从头开始往后两个位置开始
	fputs("aa", pf);
	fseek(pf, 3, SEEK_CUR);//从当前位置开始
	fputs("kikll", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

ftell函数:

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

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);
	fseek(pf, 2, SEEK_SET);//从头开始往后两个位置
	fputs("aa", pf);
	int ret = ftell(pf);
	printf("%d\n", ret);
	fclose(pf);
	pf = NULL;
	return 0;
}

rewind函数:

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

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[27];
	char a = 0;
	for (a = 'A'; a <= 'z'; a++)
	{
		fputc(a, pf);
	}
	rewind(pf);
	fread(arr, 1, 26, pf);
	fclose(pf);
	pf = NULL;
	arr[26] = '\0';
	printf("%s\n", arr);
	return 0;
}

**文件读取结束的判定

        到此为止讨论了所有文件的相关函数及操作,但是有一点我们还是有点不清楚,一个函数读取文件什么时候停止呢?停止的标志是什么呢?

        那如果读取文件中途读取失败又会怎么样,返回的值类型是什么?

        接下来就详细探究探究以上函数什么时候读取结束?

feof函数:

         feof函数可以检查并判断文件是否为正常结束。

        当读取到文件末尾时结束读取,feof会返回一个非零的值,但是读的时候也会有异常结束的时候 ,这时候返回的值就是0。

        用feof判断文件是否结束还是失败是不行的。

所以这里就需要用到每个函数读取是否结束的返回值进行判断!

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

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

拷贝一份文件

int main()
{
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a = 0;
	for (a = 'A'; a <= 'Z'; a++)
	{
		fputc(a, pf);
		if (a % 5 == 0)
		{
			fputc('\n', pf);
		}
	}
	rewind(pf);//找到起始位置
	FILE* pf1 = fopen("cool.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		fclose(pf);
		pf = NULL;
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		fputc(ch,pf1);
	}
	fclose(pf1);
	pf1 = NULL;
	fclose(pf);
	pf = NULL;
	return 0;
}

改进通讯录(可以保存在文件中)

        之前写的通讯录经过多次修改,现在可以动态化存储,单数唯一的缺点是,当运行结束后,所有的信息也会跟着销毁,不会被存储起来,现在有办法将其存储在文件中,为此要用的时候,可以打开,这样存储的信息就不会丢失了。

  结束之前将信息存入文件

      我们用fwrite写入文件,fread读取文件内容。

void savecontact(con* pc)
{
	FILE* pf = fopen("contact.txt", "wb");//二进制打开文件输出
	if (pf == NULL)
	{
		perror("fopen");
		return ;
	}
	int i = 0;
	for (i = 0; i < pc->num; i++)
	{
		fwrite(pc->contact + i,sizeof(per),1,pf);
	}
	fclose(pf);
	pf = NULL;
}

因为fwrite返回的值为读取的值,一次性读取的值我们可以进行设置

参数num为每次读取的值,当读取的值比设置的小,则返回之际读取的个数。

所以选择用while循环一次一次读取!!

开始时写入文件中保存的内容

void inputcontact(con* pc)
{
	FILE* pf = fopen("contact.txt","rb");
	if (pf == NULL)
	{
		perror("inputcontact");
		return;
	}
	//录入信息
	per tmp = { 0 };
	while (fread(&tmp, sizeof(per), 1, pf))
	{
		checkcapacity(pc);
		pc->contact[pc->num] = tmp;
		pc->num++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}

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

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

相关文章

【三】【QT开发应用】VSQT和QTCreator项目互相转化的方法,QTCreator项目转化VSQT,VSQT转化为QTCreator

VSQT和QTCreator项目互相转化的方法 QTCreator项目转化VSQT 环境变量配置 将qmake.exe所在的目录添加到系统path里面. 转化命令 qmake -tp vc xxx.pro 生成.vcxproj文件 环境变量配置 将qmake.exe所在的目录路径添加到系统path中. 接着用cmd命令行转换,可能出现的问题 …

基于机器学习和深度学习的C-MAPSS涡扇发动机剩余寿命RUL预测(Python,Jupyter Notebook环境)

涡扇发动机全称为涡轮风扇发动机&#xff0c;是一种先进的空中引擎&#xff0c;由涡轮喷气发动机发展而来。涡扇发动机主要特点是首级压缩机的面积比涡轮喷气发动机大。同时&#xff0c;空气螺旋桨&#xff08;扇&#xff09;将部分吸入的空气从喷射引擎喷射出来&#xff0c;并…

Vue使用vue-esign实现在线签名 加入水印

Vue在线签名 一、目的二、样式三、代码1、依赖2、代码2.1 在线签名组件2.1.1 基础的2.1.2 携带时间水印的 2.2父组件 一、目的 又来了一个问题&#xff0c;直接让我在线签名&#xff08;还不能存储base64&#xff09;&#xff0c;并且还得上传&#xff0c;我直接***违禁词。 好…

基于Python的垃圾分类检测识别系统(Yolo4网络)【W8】

简介&#xff1a; 垃圾分类检测识别系统旨在利用深度学习和计算机视觉技术&#xff0c;实现对不同类别垃圾的自动识别和分类。应用环境包括Python编程语言、主流深度学习框架如TensorFlow或PyTorch&#xff0c;以及图像处理库OpenCV等&#xff0c;通过这些工具集成和优化模型&a…

M41T00串行实时时钟-国产兼容RS4C1339

RS4C1340是一种实时时钟&#xff08;RTC&#xff09;/日历&#xff0c;与ST M41T00引脚兼容&#xff0c;功能等效&#xff0c;包括软件时钟校准。该器件还提供VBAT引脚上的涓流充电能力、较低的计时电压和振荡器STOP标志。寄存器映射的块访问与ST设备相同。涓流充电器和标志需要…

MATLAB 二维平面绘图

x 0:0.01:2pi: 大家还记得这个是什么意思吧 就是0到2π 每次所取的数 是相差0.01进行选取的 ysin&#xff08;x&#xff09;: figure (这个意思就是建立一个幕布) plot&#xff08;x&#xff0c;y&#xff09; 这个主要是绘制当前的二维平面的图 但是大家会发现这张图里没有标…

ArcGIS arcpy代码工具——批量要素裁剪栅格影像

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

2024最新AI大模型-LLm八股合集(三)

常见的大模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种&#xff1a; autoregressive自回归模型&#xff08;AR模型&#xff09; &#xff1a;代表作GPT。本质上是一个left-to-right的语言模型。 通常用于生成式任务 &#xff0c;在长文本生成方面取得了巨大的成功…

每日一练:攻防世界:qr-easy

本题思路与CTFSHOW: 36D杯 misc ez-qrcode思路相同 工具链接&#xff1a;补全二维码QRazyBox - QR Code Analysis and Recovery Toolkit (h3110w0r1d.com) 1.首先&#xff0c;我们需要基于上图的干净图像。 此二维码的大小为 29x29&#xff0c;版本V的大小为N N&#xff0c;…

msvcp100.dll已加载但找不到入口点的处理方法,分析比较靠谱的msvcp100.dll解决方法

用户在日常使用中有时会遇到一个错误提示&#xff1a;“已加载 msvcp100.dll&#xff0c;但找不到入口点”。这一信息不仅引发了使用上的不便&#xff0c;也对软件的稳定性产生了质疑。理解并解决该问题不仅对确保计算机正常运行至关重要&#xff0c;也对维护软件的长期稳定性和…

最新扣子(Coze)实战案例:扣子图像流的创建及使用,完全免费教程

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之教程&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

电长推荐:手机数据管理软件,免费备份恢复擦除手机数据

在信息时代&#xff0c;手机成为我们生活中不可或缺的工具。然而&#xff0c;管理手机中的海量数据却往往令人头疼。 特别是对于苹果用户&#xff0c;数据管理并不像安卓那样直观方便。 今天为大家推荐一款强大且免费的工具——苹安手机管家&#xff0c;它将为你的数据管理带…

【windows|003】计算机硬件基础及存储单位

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&…

雨量监测预警系统:非接触式测量防汛预警

TH-SW2雨量监测预警系统是一种用于监测降雨量的重要工具&#xff0c;对于防汛预警工作具有重要意义。该系统采用非接触式测量技术&#xff0c;可以实时监测雨量数据&#xff0c;并自动预警&#xff0c;以便及时采取防汛措施&#xff0c;确保人民生命财产安全。 系统组成 1. 雨…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来&#xff0c;受到了广大用户的热烈欢迎。特别是全景开发人员&#xff0c;他们使用该工具加密VR插件的JS代码, 添加域名锁等&#xff0c;都非常有效地保护了插件的代码资源。 最近&#xff0c;我们收到了许多用户的反馈&#xff0c;…

伊拉克目的港清关严控,所有管控范围内的产品务必申请COC证书

伊拉克目的港清关严控&#xff0c;所有管控范围内的产品务必申请COC证书&#xff0c;COC/COI 伊拉克使馆认证&#xff0c;欢迎随时咨询小詹 近期&#xff0c;伊拉克海关扩大了进口产品管控品类&#xff0c;从产品的12大类700多种商品拓宽到800多种商品&#xff0c; 伊拉克海关…

工厂能耗监控与管理

随着工业4.0的浪潮席卷全球&#xff0c;工厂的能耗监控与管理已不再是简单的节能降耗问题&#xff0c;而是关乎企业竞争力、环保责任及可持续发展的核心议题。在这个关键时刻&#xff0c;HiWoo Cloud平台以其独特的视角和强大的功能&#xff0c;为工厂能耗监控与管理领域带来全…

C++项目实战:SPDK文件系统

目录 一、Blobstore设计框架二、Cache机制三、Blob FS I/O操作四、SPDK FUSE (Filesystem in Userspcae) 前言 Blob FS是spdk面向于用户态的轻量级的文件系统 SPDK通过绕过内核(kernel bypass)的方案&#xff0c;构筑了用户态驱动&#xff0c;并利用异步轮询、无锁机制等&a…

Java输入输出语句 和 保留字

目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 &#xff1a; 导入该类的所在包, java.util.*创建该类对象&#xff08;声明变量&#xff09;调用里面的功能 案例要求&#xff1a;可以从控制台接收用户信息&#xff0c;【姓…

天然健康:源自大自然的馈赠

我们的农产品&#xff0c;承载着乡村的淳朴与大自然的馈赠。我们精选每一片土地&#xff0c;用科学种植方法&#xff0c;打造出品质卓越的农产品。无论是色泽鲜艳、口感脆嫩的蔬菜&#xff0c;还是香甜可口、营养丰富的水果&#xff0c;都让您在品尝美味的同时&#xff0c;享受…