geekdoc-python-zh/docs/overiq/086.md

5.9 KiB
Raw Permalink Blame History

C 中的fwrite()函数

原文:https://overiq.com/c-programming-101/fwrite-function-in-c/

最后更新于 2020 年 7 月 27 日


二进制输入和输出

到目前为止,我们一直使用文本模式来读写文件中的数据。在本章中,我们将学习如何使用二进制模式在文件中读写数据。回想一下,在二进制模式下,数据存储在文件中的方式与存储在内存中的方式相同,因此在二进制模式下不会发生数据转换。由于没有转换发生,二进制模式比文本模式快得多。

[img]

fread()fwrite()函数通常分别用于向文件读写二进制数据。虽然我们也可以在文本模式下使用它们。

先说fwrite()功能。

fwrite()函数

语法: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

fwrite()函数将 void 指针ptr指定的数据写入文件。

ptr:指向包含待写数据项的内存块。

size:指定每个要写入的项目的字节数。

n:是要写的项目数。

fp:是指向将要写入数据项的文件的指针。

成功时,它返回成功写入文件的项目数。出错时,它返回一个小于n的数字。注意两个参数(sizen)和fwrite()的返回值属于size_t类型,在大多数系统上是unsigned int

为了更好地理解fwrite()函数,请考虑以下示例:

例 1:写变量

float *f = 100.13;

fwrite(&p, sizeof(f), 1, fp);

这会将变量f的值写入文件。

例 2:写数组

int arr[3] = {101, 203, 303};

fwrite(arr, sizeof(arr), 1, fp);

这会将整个数组写入文件。

例 3:写数组的一些元素

int arr[3] = {101, 203, 303};

fwrite(arr, sizeof(int), 2, fp);

这只会将数组的前两个元素写入文件。

例 4:书写结构

struct student
{
    char name[10];
    int roll;
    float marks;
};

struct student student_1 = {"Tina", 12, 88.123};

fwrite(&student_1, sizeof(student_1), 1, fp);

这会将变量student_1的内容写入文件。

例 5:写入结构数组

struct student
{
    char name[10];
    int roll;
    float marks;
};

struct student students[3] = {
                                 {"Tina", 12, 88.123},
                                 {"Jack", 34, 71.182},
                                 {"May", 12, 93.713}
                             };

fwrite(students, sizeof(students), 1, fp);

这会将整个数组的学生写入文件。

假设我们不想将数组的所有元素都写入文件,而是只将数组的第 0 个和第 1 个元素写入文件。

fwrite(students, sizeof(struct student), 2, fp);

现在你已经明白fwrite()函数是如何工作的了。让我们使用fwrite()功能创建一个程序。

下面的程序演示了如何使用fwrite()功能。

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

struct employee
{
    char name[50];
    char designation[50];
    int age;
    float salary
} employee;

int main()
{
    int n, i, chars;
    FILE *fp;

    fp = fopen("employee.txt", "wb");

    if(fp == NULL)
    {
        printf("Error opening file\n");
        exit(1);
    }

    printf("Testing fwrite() function: \n\n");

    printf("Enter the number of records you want to enter: ");
    scanf("%d", &n);

    for(i = 0; i < n; i++)
    {
        printf("\nEnter details of employee %d \n", i + 1);

        fflush(stdin);

        printf("Name: ");
        gets(employee.name);

        printf("Designation: ");
        gets(employee.designation);

        printf("Age: ");
        scanf("%d", &employee.age);

        printf("Salary: ");
        scanf("%f", &employee.salary);

        chars = fwrite(&employee, sizeof(employee), 1, fp);
        printf("Number of items written to the file: %d\n", chars);
    }

    fclose(fp);
    return 0;
}

预期输出:

Testing fwrite() function:

Enter the number of records you want to enter: 2

Enter details of employee 1
Name: Bob
Designation: Manager
Age: 29
Salary: 34000
Number of items written to the file: 1

Enter details of employee 2
Name: Jake
Designation: Developer
Age: 34
Salary: 56000
Number of items written to the file: 1

工作原理:

在第 4-10 行中,声明了一个结构雇员,它有四个成员,即名称是一个字符数组,名称也是一个字符数组,年龄是 int 类型,工资是 float 类型。除了结构定义,还声明了一个类型为 struct employee 的变量 emp。

在第 14 行,三个变量 n、I 和 chars 被声明为 int 类型。

在第 15 行,声明了一个 struct FILE 类型的结构指针 fp。

在第 17 行fopen()函数用两个参数调用即“employee.txt”和“wb”。成功后它返回一个指向文件 employee.txt 的指针,并以只写模式打开文件 employee.txt。失败时它返回空值。

在第 19-23 行if 语句用于测试 fp 的值。如果为空printf()语句将打印错误消息,程序终止。否则,程序继续执行 if 语句后面的语句。

在第 27-28 行,程序询问用户他/她想要输入多少条记录,并将数字存储在变量 n 中。

在第 30-50 行for 循环中的语句要求用户输入四条信息,即姓名、职务、年龄和工资。请注意,在第 34 行中,调用 fflush()函数来刷新(删除)在第 28 行输入记录数时输入的标准输入中的换行符。如果没有对 fflush(stdin)的调用,那么第 37 行中的 get()函数将从标准输入中读取换行符,而不等待用户输入。在第 48 行,调用 fwrite()函数以二进制模式将结构变量 emp 写入文件。我们已经知道在成功时fwrite()返回写入文件的项目数。这里我们写的是单个结构变量的数据,所以 fwrite()将返回 1。出错时它将返回一个小于 1 的数字。然后fwrite()的返回值被赋给 chars 变量。在第 49 行printf()语句打印成功写入文件的项目数。

第 52 行,fclose()功能用于关闭文件。