我们继续上一篇博客来说明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来读写,结构体类型不统一,可以将二进制转化为文本,使其统一,降低效率并且多占用存储空间。