第十二章:文件输入/输出-5用fwrite()写二进制数据

C fwrite

目标

在本文章中,您将学习如何使用C fwrite函数来创建一个随机访问文件。

介绍C语言的fwrite()函数

fwrite()函数在stdio.h库中定义。函数的作用是:将数据写入二进制文件。

下面是fwrite()函数的语法:

fwrite (const void * ptr, size_t size, size_t count, FILE * stream);
复制代码

函数的作用是:将内存中的数据块写入文件。它有以下参数:

  • ptr是一个指针,它指向内存中要写入文件的数据块。通常,它是一个指向数据数组的指针。
  • size指定函数将写入文件的每个元素的字节数。
  • count指定函数将写入文件的元素数量。
  • stream是指向函数要写入的文件的文件指针。

函数的作用是:返回函数成功写入文件的元素个数。

一个简单的C fwrite()函数示例

下面的示例使用fwrite()函数将从0到9的数字写入文件:

#include <stdio.h>

int main()
{
    char *filename = "numbers.dat";

    // 打开用于写二进制的文件
    FILE *fp = fopen(filename, "wb");
    if (fp == NULL)
    {
        printf("错误: 打开文件 %s", filename);
        return -1;
    }
    // 向文件写数字
    for (int i = 0; i < 10; i++)
        fwrite(&i, sizeof(int), 1, fp);

    // 关闭文件
    fclose(fp);

    return 0;
}
复制代码

它是如何执行的。

首先,使用fopen()函数打开文件numbers.dat。fopen()使用wb模式将二进制数据写入文件。如果文件不存在,它将创建一个新文件。但是,如果文件已经存在,它将覆盖文件的内容。

    // 打开用于写二进制的文件
    FILE *fp = fopen(filename, "wb");
    if (fp == NULL)
    {
        printf("错误: 打开文件 %s", filename);
        return -1;
    }
复制代码

其次,从0迭代到9,并使用fwrite()函数将每个数字写入文件:

    for (int i = 0; i < 10; i++)
        fwrite(&i, sizeof(int), 1, fp);
复制代码

下面的语句将一个整数写入文件:

fwrite(&i, sizeof(int), 1, fp);
复制代码

第三,使用fclose()函数关闭文件:

    // 关闭文件
    fclose(fp);
复制代码

一个实用的C fwrite()函数示例

假设您需要将库存数据写入文件。库存包括一份记录清单,其中每条记录包含以下信息:

  • 产品名称
  • 数量

首先,定义一个包含产品名称和数量的结构体:

typedef struct
{
char name[40];
unsigned qty;
}product;
复制代码

第二,定义一个函数,允许用户输入多个产品:

bool input(product *product_list, const int size);
复制代码

input()函数的定义如下:

bool input(product *product_list, const int size)
{
    int i = 0;
    do
    {
        printf("名称:");
        scanf("%s", &product_list[i].name);
        printf("数量:");
        scanf("%d", &product_list[i].qty);
        i++;
    } while (i < size);
}
复制代码

第三,定义一个函数,将记录保存到filename指定的文件中:

bool save(product *product_list, const char *filename);
复制代码

save()函数的定义如下:

bool save(product *product_list, const int size, const char *filename)
{
    // 写清单到文件
    FILE *fp = fopen(filename, "wb");
    if (fp == NULL)
    {
        puts("错误打开文件");
        return false;
    }
    for (int i = 0; i < size; i++)
        fwrite(&product_list[i], sizeof(product), 1, fp);

    fclose(fp);

    return true;
}
复制代码

save()函数做三件事:打开文件,将产品列表中的每个结构体写到文件中,并关闭它。

最后,定义一个函数来显示输入的清单:

void display(product *product_list, const int size)
复制代码

display()函数的逻辑如下:

void display(product *product_list, const int size)
{
    // 显示产品列表
    puts("名称\t数量");
    puts("-------------");
    for (int i = 0; i < size; i++)
        printf("%s \t %d\n", product_list[i].name, product_list[i].qty);
}
复制代码

放在一起:

#include <stdio.h>
#include <stdbool.h>

typedef struct
{
    char name[40];
    unsigned qty;
} product;

bool input(product *product_list, const int size);
bool save(product *product_list, const int size, const char *filename);
void display(product *product_list, const int size);

int main()
{
    const int SIZE = 10;
    product product_list[SIZE];

    // 输入产品列表
    input(product_list, SIZE);

    // 保存到文件
    save(product_list, SIZE, "inventory.dat");

    // 显示产品列表
    display(product_list, SIZE);

    return 0;
}

void display(product *product_list, const int size)
{
    // 显示产品列表
    puts("名称\t数量");
    puts("-------------");
    for (int i = 0; i < size; i++)
        printf("%s \t %d\n", product_list[i].name, product_list[i].qty);
}

// 保存产品列表到文件
bool save(product *product_list, const int size, const char *filename)
{
    // 写清单到文件
    FILE *fp = fopen(filename, "w");
    if (fp == NULL)
    {
        puts("错误打开文件");
        return false;
    }
    for (int i = 0; i < size; i++)
        fwrite(&product_list[i], sizeof(product), 1, fp);

    fclose(fp);

    return true;
}

// 输入清单数据
bool input(product *product_list, const int size)
{
    int i = 0;
    do
    {
        printf("名称:");
        scanf("%s", &product_list[i].name);
        printf("数量:");
        scanf("%d", &product_list[i].qty);
        i++;
    } while (i < size);
}
复制代码

请注意,SIZE常量定义了用户每次输入的产品数量。

总结

  • 使用C fwrite()函数将内存中的数据块写入文件。

猜你喜欢

转载自juejin.im/post/7019061081993641992