使用二进制读写,freadf/write读写结构体【C】(zf)

使用二进制读写,freadf/write读写结构体

我们继续上一篇博客来说明fread 和fwrite函数
我们给出一个代码,这次我们读取的时候把块的大小设置为1024,每次读取一个块长度

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	FILE* pf = fopen("xx.txt","w+");
	char buf[1024] = "123456";
	fwrite(buf,1,6,pf);
	rewind(pf);
	char rbuf[1024];
	int n;
	n = fread(rbuf, 1024, 1, pf);
	printf("n = %d\n",n);
	n = fread(rbuf, 1024, 1, pf);
	printf("n = %d\n", n);
	n = fread(rbuf, 1024, 1, pf);
	printf("n = %d\n", n);
	n = fread(rbuf, 1024, 1, pf);
	printf("n = %d\n", n);
	return 0;
}

执行结果为:

在这里插入图片描述

这个是时候其实是读取进来了,只是不满1024个字节,,但是我们换一种方式。

我们再给出一个代码,这次我们读取的时候把块的大小设置为1个字节,每次读取1024块长度

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	FILE* pf = fopen("xx.txt","w+");
	char buf[1024] = "123456";
	fwrite(buf,1,6,pf);
	rewind(pf);
	char rbuf[1024];
	int n;
	n = fread(rbuf,1,1024, pf);
	printf("n = %d\n",n);
	n = fread(rbuf, 1, 1024, pf);
	printf("n = %d\n", n);
	n = fread(rbuf, 1, 1024, pf);
	printf("n = %d\n", n);
	n = fread(rbuf, 1, 1024, pf);
	printf("n = %d\n", n);
	return 0;
}

执行结果为:

在这里插入图片描述

使用二进制读写

我们在这里再次说明到unix的哲学:一切设备皆文件。
我们说整个文件是没有格式和结构的,就是一连串的字符。
不管是文本文档但是二进制文件,视频文件或者图片文件都是字符排列的。
我们进行查看:
我们用UE查看图片:
在这里插入图片描述

打开之后全部都是字节形式:
在这里插入图片描述

我们再用UE打开一个视频:
在这里插入图片描述

使用UE打开之后:

在这里插入图片描述

打开全部都是二进制文件,所以我们没有办法用文本文件去处理。

读写结构体是长项

结构体中的数据类型不统一,此时最适合用二进制的方式进行读写。二进制的接口可以读文本,而文本的接口不可以读二进制。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define OPEN_ERR(fp) \
if(fp == NULL)\
{\
 printf("open error\n");\
 return -1;\
}\

typedef struct student
{
	int num;
	char name[30];
	char sex;
	float math;
	float english;
	float chinese;
}Student;

int main()
{
	FILE* fp = fopen("stu.data", "wb+");
	OPEN_ERR(fp);
	Student stu[] = {
	{1001,"bob", 'm',100,30,20},
	{1002,"bob2",'f',100,30,20},
	{1003,"bob3",'m',100,30,20}
	};
	for (int i = 0; i < sizeof(stu) / sizeof(stu[0]); i++)
	{
		fwrite((void*)&stu[i], sizeof(Student), 1, fp);
	}
	rewind(fp);
	Student tmp;
	for (int i = 0; i < sizeof(stu) / sizeof(stu[0]); i++)
	{
		fread((void*)&tmp, sizeof(Student), 1, fp);
		printf("num: %d name:%s sex:%c math:%.2f english:%.2f chinese: % .2f\n", tmp.num, tmp.name, tmp.sex, tmp.math, tmp.english, tmp.chinese);
	}
	fclose(fp);
	return 0;
}

执行结果为:
在这里插入图片描述

当然我们可以用文本文件进行保存,但是会更加消耗硬盘空间。
那么在文件存储的时候结构体中的,我们会把字符串和字符原样保存,其他类型的数据用二进制进行保存。我们打开文件进行查看:

在这里插入图片描述

我们使用UE打开:
在这里插入图片描述

在这里插入图片描述

我们只能看懂文本的一部分,其他内容以二进制显示。

小结

使用fread/fwrite来读写,结构体类型不统一,可以将二进制转化为文本,使其统一,降低效率并且多占用存储空间。

发布了84 篇原创文章 · 获赞 71 · 访问量 9099

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104204334