C语言文件操作(2)

news2024/10/5 4:48:13

🙉本文将继续对文件操作相关知识进行讲解

1. 文件的随机读写

1.1 fseek

fseek函数原型:

fseek简而言之就是设置文件中的光标,stream就指向对象文件的指针,offset是文件中光标处相对于起始位置的偏移量,origin是光标所在位置

origin:

SEEK_CUR文件指针(光标)当前位置
SEEK_SET文件起始位置
SEEK_END文件的末尾位置

1.2 ftell

ftell函数原型:

ftell的功能就是返回贯标相对于起始位置的偏移量

1.3 rewind

rewind函数原型:

rewind的功能用于将光标的位置设置为文件的起始位置处

来看下面的代码:事先向data.txt中写入abcdef

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

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

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

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

	ch = fgetc(pf);
	printf("%c\n", ch); //d
	int i = ftell(pf); //返回偏移量
	
	printf("%d\n", i);
	fseek(pf, -4, SEEK_CUR); //设置光标
	rewind(pf); //光标回到初始位置
	ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;

	return 0;
}

打印结果:

a b c d 4 a

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

数据文件分为文本文件和二进制文件,内存中数据是以二进制形式存储的,将内存中的数据不经转换直接存储到外存,称为二进制文件;如果要外存中的数据以ASCII形式存储,则应将内存中的数据进行转换,以ASCII形式存储字符的文件称为文本文件

将10000写到二进制文件中

int main()
{
	int a = 10000;
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fwrite(&a, 4, 1, pf);

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

用vs2022以二进制编译器的形式打开data.txt:

先不用管前面的8个0,来看一下10 27 00 00是怎么来的

10000的二进制形式:0000 0000 0000 0000 0010 0111 0001 0000

转换为16进制:00 00 27 10

由于vs是小端存储模式,所以在内存中存储的是:10 27 00 00

将10000以二进制的形式存储到文件中用4个字节

以ASCII的形式存储到文件中占用5个字节(以字符形式存储)

3. 文件读取结束的判定

feof函数原型:

feof用于判断文件读取结束后,是在读取过程中因为遇到错误而结束还是正常读取结束,

在读取文本文件文件过程中fgetc读取错误则返回EOF,fgets读取错误则返回NULL;

在读取二进制文件过程中fread返回其读取到的元素个数这是fread的函数原型:size_t fread(void* ptr, size_t size, size_t count, FILE * stream);假如fread每次读取5个元素,但如果文件中只有11个元素,前两次返回的结果为5,最后一次文件中只剩一个元素,那么fread只会读取这一个元素,返回结果也就是1,

int main()
{
	FILE* pfread = fopen("data1.txt", "r");
	if (pfread == NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pfread)) != EOF)
	{
		;
	}
	if (ferror(pfread))
	{
		printf("遇错结束,读取失败");
	}
	else if (feof(pfread))
	{
		printf("正常结束,读取成功");
	}

    return 0;
}

4. 文件缓冲区

系统会自动给正在使用的文件在内存中开辟一块文件缓冲区,当程序中的数据输出到文件中时,会将这些数据先放在输出缓冲区,当输出缓冲区满时再传输到磁盘中,当要将文件中的数据输入到程序数据区时,会将这些数据先放在输入缓冲区,当输入缓冲区满时再传输到程序数据区中

接下来给出一段代码来证明文件缓冲区是存在的:

int main()
{
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);//先将数据写到了缓冲区,由于还没有刷新缓冲区,数据此时仍然在缓冲区
	
    printf("睡10秒\n");
	Sleep(10000);//再程序睡眠期间打开文件,发现此时文件为空
	
    fflush(pf); //刷新缓冲区:将缓冲区中的数据写到文件中
	
    printf("睡5秒\n");
	Sleep(5000);//此时程序睡眠期间,数据已经写到了文件中

	fclose(pf);//关闭文件的操作也会刷新缓冲区
	pf = NULL;

	return 0;
}

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

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

相关文章

Docker 容器应急

容器网络简单理解 容器拥有n多张veth网卡与一张docker0网卡 docker 五种网络 bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。host 容器不会获得一个独立的network namespace,而是与宿主机共用一个…

关于Win系统提示由于找不到msvcr120.dll文件问题解决办法

在我使用电脑的过程中,突然弹出了一个错误提示框,提示我系统中缺少msvcp120.dll文件。这个文件是系统运行所必需的,缺少它可能会导致一些软件无法正常运行。经过一番搜索和咨询,我找到了以下几种解决方案,分享给大家&a…

【Java学习之道】文件输入输出流

引言 今天,我们将一起学习Java中的文件输入/输出流,这是许多初学者感到困惑但实际工作中经常遇到的问题。在本部分,我们将探讨文件输入/输出流的基本概念,以及如何使用Java中的类来处理文件输入/输出。 一、文件输入/输出流的概…

C语言,输出最长连号的个数

数据范围&#xff1a;0 < n <10000. 最长连号&#xff0c;就是一组数字里面出现的连续的数字的最长长度。这里的连号最长是2 3 4 5 6&#xff0c;个数为5。 要实现求连号的个数&#xff0c;就要创建一个变量&#xff0c;用来专门计算连号的个数。在不满足连号时&#xf…

shiro反序列化漏洞分析

分析源码 我们去源码里面去找找&#xff0c;搜索rememberMe&#xff1a; 发现有一个 CookieRememberMeManager 这个类&#xff0c;看名字就知道他多半就是处理 RememberMe 的逻辑&#xff0c;所以根据该类查看它干了什么 这里继承 AbstractRememberMeManager 类&#xff0c;Ab…

精益生产与MES生产管理系统相互融合

近年来&#xff0c;精益生产理念在企业管理中越来越受欢迎。它强调以最小的浪费&#xff0c;在最短的时间内&#xff0c;生产出高质量的产品。这一理念的实施手段包括准时制生产方式、适时生产方式等&#xff0c;消除浪费、看板、快换工装等都是精益提高的工具方针。 然而&…

【基础篇】四、本地部署Flink

文章目录 1、部署模式2、本地独立部署会话模式的Flink3、本地独立部署会话模式的Flink集群4、向Flink集群提交作业5、Standalone方式部署单作业模式6、Standalone方式部署应用模式的Flink 1、部署模式 会话模式&#xff08;Session Mode&#xff09; 先启动Flink集群&#xff0…

【BugBounty】记一次XSS绕过

前言 最近一直在看国外的赏金平台&#xff0c;绕waf是真的难受, 记录一下绕过的场景。 初步测试 一开始尝试XSS&#xff0c;发现用户的输入在title中展示&#xff0c;那么一般来说就是看能否闭合&#xff0c;我们从下面图中可以看到&#xff0c;输入尖括号后被转成了实体。 …

人大金仓数据库V8 windows下安装

此文为人大金仓数据库安装程序&#xff08;windows下kingbase开发及测试用&#xff09;。 1 人大金仓-成为世界卓越的数据库产品与服务提供商 官方下载安装包&#xff0c;同时需要下载授权文件&#xff0c;补丁文件可以不下。 2 点击安装 3 选择授权文件 4 默认安装即可&…

百万买手,小红书电商商业化之锚

继直播电商平台后&#xff0c;双11再次迎来新玩家——小红书。 在“2023小红书双十一电商伙伴动员会”上&#xff0c;小红书宣布将在双十一期间投入百亿流量扶持和亿级补贴&#xff0c;这也标志着小红书正式参与到这场电商盛宴中。 值得关注的是&#xff0c;小红书提到要投入…

【EI会议征稿】第三届大数据、人工智能与风险管理国际学术会议 (ICBAR 2023)

第三届大数据、人工智能与风险管理国际学术会议 (ICBAR 2023) 2023 3rd International Conference on Big Data, Artificial Intelligence and Risk Management 第三届大数据、人工智能与风险管理国际学术会议&#xff08;ICBAR2023&#xff09;将于2023年11月24-26日在中国成…

2023年,PMP的知识是否过时了?

关于PMP现如今还是否实用&#xff0c;是否过时了这一问题我也考虑过。PMP的知识是否是只能在传统行业应用&#xff1f;它适合在互联网领域进行项目管理吗&#xff1f; 首先&#xff0c;要说清楚PMP是什么&#xff1f; PMP&#xff08;Project Management Professional&#x…

Vue 关于组件封装时父子组件通讯的三种方式

主要是遵循vue的单向数据源规则&#xff0c;具体用什么方式取决于自己以及项目实际情况 如果是基本类型&#xff0c;可以使用比较简单直接的方法&#xff0c;这里三种方式主要是针对的对象&#xff0c;里面会包含多个参数 方式一&#xff1a;直接通过props直接修改子组件里的值…

从一部iPhone手机看芯片的分类

目录 问题 iPhone X 手机处理器&#xff1a;A11 iPhone X 的两大存储芯片 数字 IC CPU&#xff1a;计算设备的运算核心和控制核心 GPU&#xff1a;图形处理器 ASIC&#xff1a;为解决特定应用问题而定制设计的集成电路 存储芯片&#xff1a;DRAM 和 NAND Flash iPhone…

成集云 | 管家婆ERP集成金蝶云星辰 | 解决方案

源系统成集云目标系统 ​ 编辑 方案介绍 管家婆ERP系统是一个全面而灵活的企业资源计划平台&#xff0c;旨在帮助企业优化和自动化其业务流程&#xff0c;从而提高效率和生产力。该系统集成了从供应链管理、生产管理、财务管理到人力资源管理等所有企业运营方面的功能&#x…

时刻保护留守/独居老人,TSINGSEE青犀AI智能视频监控云监管方案

随着老龄化的发展&#xff0c;老弱群体逐年攀升&#xff0c;其中也不乏独居和留守老人&#xff0c;由于子女和监护人不能时刻陪伴左右&#xff0c;独居老人的日常生活安全&#xff0c;也是大家十分关注的一点&#xff0c;旭帆科技独居/留守老人智能监控方案&#xff0c;为了确保…

centos7.9部署nexus内网源服务器(yum,apt)

1、通过官网或其他方式下载安装包 2、安装Java&#xff0c;自行下载 [rootlocalhost ~]# ll total 189992 -rw-------. 1 root root 1663 Oct 8 09:06 anaconda-ks.cfg -rw-r--r--. 1 root root 194545143 Oct 8 17:43 jdk-8u241-linux-x64.tar.gz [rootlocalhost ~]# …

【C++】进阶模板

模板进阶 一、非类型模板参数二、模板的特化1. 函数模板的特化2. 类模板特化3. 模板特化的应用 三、模板的分离编译1. 分离编译2. 模板的分离编译3. 解决方法 四、模板总结 我们在 初识模板 中已经初步接触过模板了&#xff0c;下面我们开始更进一步学习模板。 一、非类型模板…

webservice接口自动化测试

1&#xff0c;用soupui进行测试 2&#xff0c;安装soupUI 3&#xff0c;测试的时候是给了一个wdsl 操作步诹&#xff1a;new &#xff08;name , 填写地址&#xff09;---导入wsdl文件---看到所有的接口 发送请求的格式<xml> canshu</xml> 应用场景&#xff0c…

模拟大数相加

字符串的大数相加&#xff0c;不可以直接使用stoi&#xff0c;或者stoll这种函数去相加&#xff0c;随时有可能越界。只需要模拟计算加法的过程就可以了。 1.定义两个尾指针&#xff0c;指向num1,nums2的最后一个数字&#xff0c;让这两个数字相加&#xff0c;并把相加的结果记…