问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C编程中fread()和fwrite()函数详解

创作时间:
作者:
@小白创作中心

C编程中fread()和fwrite()函数详解

引用
CSDN
1.
https://blog.csdn.net/mzgxinhua/article/details/140058586

在C语言编程中,处理文件输入和输出是必不可少的一部分。标准库提供了多种函数来简化这一过程,其中fread()fwrite()函数是处理二进制文件读写操作的两种常用函数。本文将详细介绍这两个函数的使用方法、原理以及应用场景,帮助读者更好地理解和使用它们。

一、基础概念

1.1 文件操作基础

在C语言中,文件操作是通过标准I/O库(stdio.h)中的函数进行的。文件操作的一般步骤包括:

  1. 打开文件:使用fopen()函数。
  2. 读写文件:使用fread()fwrite()函数。
  3. 关闭文件:使用fclose()函数。

1.2 二进制文件与文本文件

文件在计算机中有两种基本形式:二进制文件和文本文件。文本文件包含人类可读的字符,而二进制文件则包含机器可读的二进制数据。fread()fwrite()主要用于处理二进制文件,因为它们直接读写原始数据,而不进行任何格式转换。

二、fread()函数详解

2.1 函数原型

fread()函数的原型定义在stdio.h头文件中,原型如下:

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

2.2 参数解释

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

2.3 返回值

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

2.4 示例代码

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

#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()函数详解

3.1 函数原型

fwrite()函数的原型定义在stdio.h头文件中,原型如下:

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

3.2 参数解释

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

3.3 返回值

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

3.4 示例代码

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

#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()的应用场景

4.1 处理结构体数据

fread()fwrite()常用于处理结构体数据。以下示例展示了如何读写结构体:

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

typedef struct {
    int id;
    char name[20];
    float salary;
} Employee;

int main() {
    FILE *file;
    Employee emp = {1, "John Doe", 50000.0};
    Employee readEmp;

    // 写入结构体数据到文件
    file = fopen("employee.bin", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }
    fwrite(&emp, sizeof(Employee), 1, file);
    fclose(file);

    // 从文件读取结构体数据
    file = fopen("employee.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }
    fread(&readEmp, sizeof(Employee), 1, file);
    fclose(file);

    // 打印读取的数据
    printf("ID: %d, Name: %s, Salary: %.2f\n", readEmp.id, readEmp.name, readEmp.salary);
    return EXIT_SUCCESS;
}

4.2 处理大数据文件

在需要处理大数据文件时,fread()fwrite()的高效性显得尤为重要。以下示例展示了如何批量读取和写入大数据文件:

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

int main() {
    FILE *srcFile, *destFile;
    char buffer[1024];
    size_t bytesRead;

    // 打开源文件和目标文件
    srcFile = fopen("source.dat", "rb");
    if (srcFile == NULL) {
        perror("Failed to open source file");
        return EXIT_FAILURE;
    }
    destFile = fopen("destination.dat", "wb");
    if (destFile == NULL) {
        perror("Failed to open destination file");
        fclose(srcFile);
        return EXIT_FAILURE;
    }

    // 读取源文件并写入目标文件
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), srcFile)) > 0) {
        fwrite(buffer, 1, bytesRead, destFile);
    }

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

4.3 处理图像文件

图像文件通常是二进制文件,需要使用fread()fwrite()进行处理。以下示例展示了如何读取和写入位图图像文件:

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

int main() {
    FILE *file;
    unsigned char header[54];
    unsigned char *imageData;
    int width, height;
    size_t imageSize;

    // 打开位图文件
    file = fopen("image.bmp", "rb");
    if (file == NULL) {
        perror("Failed to open image file");
        return EXIT_FAILURE;
    }

    // 读取位图文件头
    fread(header, sizeof(unsigned char), 54, file);

    // 获取图像宽度和高度
    width = *(int*)&header[18];
    height = *(int*)&header[22];

    // 计算图像数据大小
    imageSize = 3 * width * height;

    // 分配内存并读取图像数据
    imageData = (unsigned char *)malloc(imageSize);
    fread(imageData, sizeof(unsigned char), imageSize, file);
    fclose(file);

    // 处理图像数据(例如:打印图像信息)
    printf("Width: %d, Height: %d\n", width, height);

    // 写入图像数据到新文件
    file = fopen("new_image.bmp", "wb");
    if (file == NULL) {
        perror("Failed to open new image file");
        free(imageData);
        return EXIT_FAILURE;
    }
    fwrite(header, sizeof(unsigned char), 54, file);
    fwrite(imageData, sizeof(unsigned char), imageSize, file);

    // 释放内存并关闭文件
    free(imageData);
    fclose(file);
    return EXIT_SUCCESS;
}

五、注意事项

5.1 错误处理

在使用fread()fwrite()时,务必进行错误处理,确保文件操作成功。例如,检查返回值是否等于预期的读写数量,并使用ferror()函数检查是否发生错误。

5.2 内存管理

在进行文件读写操作时,确保正确管理内存,避免内存泄漏。特别是在动态分配内存时,操作完成后要及时释放内存。

5.3 文件关闭

文件操作完成后,务必使用fclose()函数关闭文件,避免文件描述符泄漏。

六、总结

本文详细介绍了C编程中fread()fwrite()函数的使用方法及其应用场景。这两个函数是处理二进制文件读写操作的重要工具,掌握它们的使用能够提高程序的文件处理能力和效率。通过示例代码,我们展示了如何在实际编程中使用这些函数,希望对读者有所帮助。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号