fread函数和fwrite函数

admin 11 0

### fread函数和fwrite函数:C语言中的二进制文件处理利器

在C语言编程中,文件操作是不可或缺的一部分,尤其是处理二进制文件时,`fread`和`fwrite`函数成为了开发者们的得力助手,这两个函数定义在标准I/O库(stdio.h)中,专门用于二进制文件的读写操作,它们直接操作原始数据,不进行任何格式转换,因此非常适合处理图像、音频、视频等复杂数据类型,本文将详细介绍`fread`和`fwrite`函数的使用方法、原理以及应用场景。

#### 一、fread函数详解

`fread`函数用于从文件中读取数据到指定的内存缓冲区中,其函数原型定义在`stdio.h`头文件中,具体形式如下:

```c

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

- **ptr**:指向存储读取数据的缓冲区的指针。
- **size**:每个数据单元的大小(以字节为单位)。
- **nmemb**:要读取的数据单元的数量。
- **stream**:文件指针,指向要读取的文件。

`fread`函数返回成功读取的数据单元数量。如果返回值小于`nmemb`,则可能是遇到了文件结尾或发生了读取错误。

##### 示例代码

以下示例展示了如何使用`fread`从二进制文件中读取数据:

```c
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file;
    char buffer[100];
    size_t bytesRead;

    // 打开文件以读取模式
    file = fopen("example.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 读取文件内容
    bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file);
    if (bytesRead < sizeof(buffer)) {
        if (feof(file)) {
            printf("End of file reached.\n");
        } else if (ferror(file)) {
            perror("Error reading file");
        }
    }

    // 处理读取的数据(例如打印)
    printf("Read %zu bytes from file.\n", bytesRead);

    // 关闭文件
    fclose(file);
    return EXIT_SUCCESS;
}

#### 二、fwrite函数详解

与`fread`相对应,`fwrite`函数用于将数据写入到指定的文件中,其函数原型同样定义在`stdio.h`头文件中,具体形式如下:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

- **ptr**:指向要写入数据的缓冲区的指针。
- **size**:每个数据单元的大小(以字节为单位)。
- **nmemb**:要写入的数据单元的数量。
- **stream**:文件指针,指向要写入的文件。

`fwrite`函数返回成功写入的数据单元数量。如果返回值小于`nmemb`,则可能是发生了写入错误。

##### 示例代码

以下示例展示了如何使用`fwrite`向二进制文件中写入数据:

```c
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file;
    char buffer[100] = "This is an example of fwrite() function in C programming.";
    size_t bytesWritten;

    // 打开文件以写入模式
    file = fopen("example.bin", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 写入文件内容
    bytesWritten = fwrite(buffer, sizeof(char), sizeof(buffer), file);
    if (bytesWritten < sizeof(buffer)) {
        perror("Error writing file");
    } else {
        printf("Written %zu bytes to file.\n", bytesWritten);
    }

    // 关闭文件
    fclose(file);
    return EXIT_SUCCESS;
}

#### 三、fread和fwrite的应用场景

##### 1. 处理结构体数据

`fread`和`fwrite`常用于处理结构体数据,由于结构体可能包含多种类型的数据(如整型、浮点型、字符数组等),直接读写结构体可以保持数据的完整性和一致性。

#include

#include

typedef struct {

int id;

char name[20];

float salary;