两小时让你全方位的认识文件(完结)

news2024/10/3 0:22:53

上期阿博给友友们讲了一些关于文件的一些读写操作,这期给友友们分享一下二进制的方式和文件操作的一些误区,下面来跟着阿博走进文件吧🤗🤗🤗

文章目录

    • 一.fread和fwrite功能介绍
    • 二.文件的随机读写
    • 三.文本文件和二进制文件
    • 四.文件读取结束的判定
    • 五.文件缓冲区

一.fread和fwrite功能介绍

二.文件的随机读写

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

四.文件读取结束的判定

五.文件缓冲区

一.fread和fwrite功能介绍

fwrite
在这里插入图片描述
在这里插入图片描述
代码解析

struct S 
{
	char name[20];
	int age;
	float  score;
};
int  main()                  //测试fwrite
{
	struct S s = { "zhangsan",20,94.5f };
	FILE* pf = fopen("text.dat", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	fwrite(&s, sizeof(struct S), 1, pf);
	fclose(pf);
	pf = NULL;
	return  0;
}

在这里插入图片描述

友友们,这里看不懂很正常,因为我们这里是以二进制的形式去写文件,它们的二进制形式和文本形式是截然不同的

fread

在这里插入图片描述

代码解析

struct S
{
	char name[20];
	int age;
	float  score;
};
int  main()                               //测试fread
{
	struct S s = {0};
	FILE* pf = fopen("text.dat", "rb");
	if (pf == NULL)
	{     
		perror("fopen");
		return;
	}
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return  0;
}

在这里插入图片描述

所以说友友们,虽然二进制的文件我们看不懂,但是我们可以以二进制形式把它读出来😲😲😲

二.文件的随机读写

fseek

在这里插入图片描述
在这里插入图片描述

友友们注意了,我先把text.dat文件里面放abcdefjhi

在这里插入图片描述

代码解析

int main()
{
	FILE* pf = fopen("text.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	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

	//这次我们希望读到的是b
	fseek(pf, -3, SEEK_CUR);
	//fseek(pf,1,SEEK_SET);
	//fseek(pf,-7,SEEK_END);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return  0;
}

在这里插入图片描述
在这里插入图片描述

ftell

在这里插入图片描述

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

代码解析

int main()
{
	FILE* pf = fopen("text.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	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

	这次我们希望读到的是b
	//fseek(pf, -3, SEEK_CUR);
	//ch = fgetc(pf);
	printf("%d\n", ftell(pf));
	fclose(pf);
	pf = NULL;
	return  0;
}

在这里插入图片描述

rewind

在这里插入图片描述

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

代码解析

int main()
{
	FILE* pf = fopen("text.dat", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	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

	这次我们希望读到的是b
	//fseek(pf, -3, SEEK_CUR);
	//ch = fgetc(pf);
	/*printf("%d\n", ftell(pf));*/
	rewind(pf);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return  0;
}

在这里插入图片描述

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

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

代码解析

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

下面阿博给友友们介绍一下查看二进制的方法😽😽😽

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.文件读取结束的判定

友友们注意,这里有个雷区⛳⛳⛳
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束.
feof的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束.
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
1.fgetc 判断是否为 EOF .
2.fgets 判断返回值是否为NULL.
二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数.

在这里插入图片描述

五.文件缓冲区

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

在这里插入图片描述

代码解析

#include <stdio.h>
#include <windows.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

这里可以得出一个结论:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题

好了友友们,文件的内容到这里就告一段落了,希望友友们能够有所收获,真正的掌握文件,码字不易,友友们可以给阿博点个关注哦,后续阿博会继续分享干货知识,让我们下期再见.🌺🌺🌺

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

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

相关文章

17.网络爬虫—Scrapy入门与实战

这里写目录标题 Scrapy基础Scrapy运行流程原理Scrapy的工作流程Scrapy的优点 Scrapy基本使用(豆瓣网为例)创建项目创建爬虫配置爬虫运行爬虫如何用python执行cmd命令数据解析打包数据打开管道pipeline使用注意点 后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介…

第一章Git学习(尚硅谷新版Git快速入门)

文章目录 为什么要学习Git为什么要学习Git软件为什么要学习Git软件Git基础概念版本控制集中式、分布式版本控制的区别Git工作区域Git分支 版本号什么是版本号文件操作对应的版本号分支操作对应的原理 命令行操作Git相关配置的指令获取当前Git的配置信息名称和邮箱 Git文件操作相…

随笔-你买罐头干什么

生产环境不太稳定&#xff0c;正在挠头&#xff0c;想着怎么能解决这个问题。 聊天工具上突然弹出一张图片&#xff0c;是个不认识的人&#xff08;暂且称为Z&#xff09;发的。点进去一看&#xff0c;是从一个表格截取的一条数据&#xff0c;内容是我某次加班餐的订单。 Z&a…

带头单向链表源码及相关练习

目录 移除链表元素 链表的中间节点 链表倒数第k个节点 合并两个有序链表 相交链表 环形链表 环形链表2 分割链表 回文链表 public class MySingleList {//内部类的使用class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}…

Java基础:容器知识点

目录 1、Java容器都有哪些&#xff1f; 2、Collection 和 Collections 区别&#xff1f; 3、List、Set、Map 间的区别&#xff1f; 4、HashMap 和 Hashtable 区别&#xff1f; 5、如何决定用 HashMap 还是 TreeMap&#xff1f; 6、HashMap 的实现原理&#xff1f; 7、说…

浮点型在内存中的存储

常见的浮点数&#xff1a; 3.14159 1E10&#xff08;科学计数法&#xff1a;1.0*10^10&#xff09; 浮点数家族包括&#xff1a; float、double、long double 类型 浮点数表示的范围&#xff1a;float.h中定义 下面举一个例子&#xff1a; int main() {int n 9;float *pFloat…

动态规划专练(一)

文章目录 前言一、斐波那契数1.题目介绍2.思路3.代码 二、爬楼梯1.题目介绍2.思路3.代码 三、使用最小花费爬楼梯1.题目介绍2.思路3.代码 前言 此篇为动态规划的初阶篇&#xff0c;所以比较简单&#xff0c;适合刚入门的新手学&#xff0c;如果你已经入门了&#xff0c;就无需看…

[LeetCode]杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上…

(三)Python-tkinter桌面应用(爱心雨)

&#xff08;三&#xff09;Python-tkinter桌面应用&#xff08;爱心雨&#xff09; 一、前言 我们已经了解到tkinter可以制作爱心&#xff0c;弹幕&#xff0c;为了能让他看起来更加的充满心意&#xff0c;于是&#xff0c;我们决定将他制作为爱心雨。让它看起来更加的特别&a…

字节测试总监深度剖析,都2023年了,测试用例还不重视起来

​ 测试用例对于测试工作的作用&#xff1a; 1、指导测试的实施 测试用例主要适用于集成测试、系统测试和回归测试。在实施测试时测试用例作为测试的标准&#xff0c;测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中…

超长JVM总结,面试必备

目录 什么是JVM JVM内存区域 JVM运行时内存(jdk1.7) 垃圾回收与算法 分代收集算法 GC 分代收集算法 VS 分区收集算法 GC 垃圾收集器 什么是JVM JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收&#xff0c;…

ChatGPT已死?AutoGPT太强?

今天聊聊 AutoGPT。 OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#xff0c;最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉…

PYTHON中的常见离散分布

1.什么是伯努利分布&#xff1f; 伯努利分布是一种二元随机变量的概率分布&#xff0c;其中一个结果的概率为p&#xff0c;另一个结果的概率为1-p。伯努利分布通常用于模拟二项分布&#xff0c;其中n个独立的伯努利试验被执行&#xff0c;每个试验有两个可能的结果&#xff08…

Unity VFX -- (5)VFX Graph基础

在Unity中&#xff0c;还有一种完全不同的创建VFX的工作流&#xff0c;VFX Graph。VFX Graph能够生成出和粒子系统相同或更好的效果。 相比于粒子系统&#xff0c;VFX Graph的一个最大的好处是它能够在保持应用良好性能的情况下&#xff0c;模拟出多得多的粒子。对于VFX艺术家来…

人生是一个长期的均值回归

到了现在这个阶段&#xff0c;总想说点什么。 我一直觉得记录并收藏每个阶段的状态是一件很有意义且奇妙的事&#xff0c;尤其是多少年后还能清晰地回忆其当初的心境&#xff0c;联想到曾经所设立的一些目标以及为之做出的努力&#xff0c;这些人生经历的脉纹清晰而完整&#x…

机器学习算法 KNN

文章目录 一、概述二、代码实现三、K值的选择四、距离计算五、总结1. K-近邻算法2. 优缺点 一、概述 k-近邻算法&#xff08;k-Nearest Neighbour algorithm&#xff09;&#xff0c;又称为KNN算法&#xff0c;是数据挖掘技术中原理最简单的算法。 KNN的工作原理&#xff1a;…

QT学习笔记6

一.QLable控件使用&#xff1a; 创建控件&#xff1a; 方式一&#xff1a;代码 文本&#xff1a; QLabel *labelnew QLabel(this);//建立标签 label->setText("这是代码创建标签"); 超链接&#xff1a; label->setText("<h1><a href\"h…

面向对象三大特性之一:封装

目录 什么是封装&#xff1f; 封装的优点 封装的实现 总结 在C中&#xff0c;类和对象是面向对象编程的基础&#xff0c;而封装是面向对象编程的三大特性之一。封装的作用是将数据和行为组合在一起&#xff0c;形成一个类&#xff0c;对外部隐藏实现细节&#xff0c;从而提高…

【C++】位图模拟实现

文章目录 需要实现的接口构造函数如何得知要设置的元素的位置setresetfliptestsizecountanynoneall打印位图的信息 bitset.h 需要实现的接口 namespace Mango {template<size_t N> //N表示开多少个比特位class bitset{public://构造函数bitset();//设置位,将某一个数对应…

Error:java: 程序包lombok不存在

Error&#xff1a;java: 程序包lombok不存在 有时候明明代码窗口里可以看到有这个类,但是启动就是报错说不存在(图1,图2),试过很多办法 1.查看工具中maven的设置,setting文件目录,maven目录,本地仓库目录 2.删除本地maven中的包,重新import, 3.jdk版本是否和pom里面的一致 4.重…