前言
二进制文件的读写是程序员们经常会遇到的一个场景,难是不难,但如果不熟悉的话,等到要用的时候还是会着急忙慌的。因此本文将结合一个具体的例子来介绍C语言中的二进制文件读写,这也是我自我学习的一个记录。
一、函数介绍
在本例中,我们尝试在一个文件中写入10个字节的数据,其中每个字节均为0xFF
,然后我们再将数据读取出来。为了完成这个任务,我们需要三个函数,我们一个个来看。
- 第一个函数为
fopen()
,它的函数原型如下
FILE *fopen(const char *__restrict__ _Filename, const char *__restrict__ _Mode)
顾名思义,该函数用于打开一个文件,第一个参数代表文件名,第二参数代表访问模式,比如读r
、写w
,它的返回值是一个指针。(更多的访问模式本处就不一一列举了,大家可自行查阅)
- 第二个函数为
fwrite()
,它的函数原型为
size_t fwrite(const void *__restrict__ _Str, size_t _Size, size_t _Count, FILE *__restrict__ _File)
该函数的作用是往文件中写入数据。__restrict__ _Str
为写入数据块的首地址,参数_Size
与_Count
决定了写入的数据长度,_Size
是每个元素的长度,_Count
是元素的个数,怎么理解呢,如下图所示,总数据被分为了3块,每块1个字节。
1B | 1B | 1B |
---|
__restrict__ _File
就是我们使用fopen()
之后得到的文件指针,我们通过它往文件里写数据。
- 第三个函数为
fread()
,它的函数原型如下所示
size_t fread(void *__restrict__ _DstBuf, size_t _ElementSize, size_t _Count, FILE *__restrict__ _File)
该函数的作用是从文件中读取数据。参数的含义与fwrite()
类似,第一个参数为目标地址,也就是你想把数据存在哪里,参数_ElementSize
、_Count
、__restrict__ _File
的含义与fwrite()
中的一样,只是__restrict__ _File
指向的是你想读取的文件。
二、代码
有了上面的三个函数,我们就可以编写代码来实现我们的例程了。代码如下:
#include<stdio.h>
int main()
{
// 文件指针pd
FILE *pd = NULL;
unsigned __int8 a[10];
unsigned __int8 b[10];
int i;
for (i = 0; i < 10; i++)
{
a[i] = 0xff;
}
// 写入二进制文件
// 文件名:"test.bin", 访问方式:"wb"
pd = fopen("test.bin", "wb");
// 数据块首地址: "&a",元素大小: "sizeof(unsigned __int8)", 元素个数: "10", 文件指针:"pd"
fwrite(&a, sizeof(unsigned __int8), 10, pd);
fclose(pd);
// 读取二进制文件
// 文件名:"test.bin", 访问方式:"rb"
pd = fopen("test.bin", "rb");
// 数据块首地址: "&b",元素大小: "sizeof(unsigned __int8)", 元素个数: "10", 文件指针:"pd"
fread(&b, sizeof(unsigned __int8), 10, pd);
for (i = 0; i < 10; i++)
{
printf("b[%d] = 0x%x\n", i, b[i]);
}
fclose(pd);
}
生成test.bin
文件后,我们可以用二进制查看工具看一下文件里的数据,看是不是和我们预期的一样。这里给大家推荐一个二进制文件查看器:
Free Hex Editor Neo
用它就可以打开我们的test.bin
了。
最后,欢迎大家交流指正~