理解 C 语言中的 fread 函数

在 C 语言的文件操作中,fread 是一个十分实用的函数,它能够帮助我们从文件中读取数据块,尤其擅长处理像图片、音频等。接下来,我来为你详细介绍一下。

函数的基本形式

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

参数解释 :

buffer :这是一个指针,指向一块内存区域,就像是一个 “仓库”,读取到的数据就会被存放在这里。size :表示每个元素所占的大小,以字节为单位。比如说,如果我们要读取整型数据(int 类型),那每个整数所占的字节数就是这个 size 的值,通常是 4 字节。count :是要读取的元素个数。比如我们想读取文件中的 10 个整数,那 count 就是 10。stream :指向 FILE 对象的指针,它标识了我们要从中读取数据的文件。通过它,函数就知道数据来自哪个具体的文件。

返回值 :返回实际读取到的元素数量。如果这个数量小于我们请求的 count 值,可能是到达文件末尾了,或者在读取过程中出现了错误。如果返回值是 0,那可能是发生了错误,或者已经到达了文件的末尾。

实例解析

#include

#include

int main() {

FILE *file = fopen("example.bin", "rb");// 以二进制读取模式打开文件

if (file == NULL) {

perror("Failed to open file");

return 1;

}

// 每个元素的大小,这里是整型的大小

const size_t elementSize = sizeof(int);

// 要读取的元素数量

const size_t elementCount = 10;

// 分配内存存储读取的数据,相当于准备一个 “仓库”

int *buffer = (int *)malloc(elementSize * elementCount);

if (buffer == NULL) {

perror("Memory allocation failed");

fclose(file);

return 1;

}

// 从文件中读取数据

size_t bytesRead = fread(buffer, elementSize, elementCount, file);

// 成功读取的情况

if (bytesRead == elementCount) {

printf("Successfully read %zu elements from the file.\n", bytesRead);

for (size_t i = 0; i < bytesRead; ++i) {

printf("%d ", buffer[i]);

}

printf("\n");

}

// 读取未达到预期的情况

else {

printf("Failed to read the requested number of elements. "

"Only %zu elements were read.\n", bytesRead);

}

// 关闭文件并释放内存,完成 “收尾” 工作

fclose(file);

free(buffer);

return 0;

}

在这个例子中,我们先打开了一个名为 “example.bin” 的二进制文件,然后准备了一个足够大小的内存缓冲区来存储读取的 10 个整数。接着,调用 fread 函数从文件中读取数据,并判断是否成功读取了期望的元素数量,最后把读取的数据打印出来,并做好资源清理工作。