首页 > 编程笔记 > C语言笔记 阅读:10

C语言fread()和fwrite():以数据块的形式读写文件(附带实例)

C语言中,fputc() 和 fgetc() 函数每次只能处理文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,例如对一个结构体变量值进行读写。本节介绍实现整块数据读和写的 fread() 和 fwrite() 函数。

fread() 函数的一般形式如下:
fread(buffer,size,count,fp);
该函数的作用是从 fp 所指向的文件中读入 count 次,每次读 size 字节,读入的信息存在 buffer 地址中。如果调用 fread() 函数成功,则函数返回值等于 count 的值。

fwrite() 函数的一般形式如下:
fwrite(buffer,size,count,fp);
该函数的作用是将以 buffer 地址开始的信息输出 count 次,每次写 size 字节到 fp 所指向的文件中。如果调用 fwrite() 函数成功,则函数返回值等于 count 的值。

有以下几点说明:
例如:
fread(a,2,3,fp);
上述代码的含义是从 fp 所指向的文件中每次读两个字节输入数组 a,连续读 3 次。

fwrite(a,2,3,fp);
上述代码的含义是将 a 数组中的信息每次输出两个字节到 fp 所指向的文件中,连续输出 3 次。

【实例】实现将录入的通信录信息保存到磁盘文件中,在录入完信息后,将全部信息输出。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS                /*解除vs安全性检测问题*/
#include <stdio.h>
#include <process.h>
struct address_list                           /*定义结构体存储信息*/
{
    char name[10];
    char adr[20];
    char tel[15];
} info[100];
void save(char* name, int n)                 /*自定义save()函数*/
{
    FILE* fp;                    /*定义一个指向FILE类型结构体的指针变量*/
    int i;
    if ((fp = fopen(name, "wb")) == NULL)    /*以只写方式打开指定文件*/
    {
        printf("cannot open file\n");
        exit(0);
    }
    for (i = 0; i < n; i++)
         /*将一组数据输出到fp所指向的文件中*/
        if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)   
            printf("file write error\n");/*如果写入文件不成功,则输出错误信息*/
    fclose(fp);                                /*关闭文件*/
}
void show(char* name, int n)                   /*自定义show()函数*/
{
    int i;
    FILE* fp;                     /*定义一个指向FILE类型结构体的指针变量*/
    if ((fp = fopen(name, "rb")) == NULL)      /*以只读方式打开指定文件*/
    {
        printf("cannot open file\n");
        exit(0);
    }
    for (i = 0; i < n; i++)
    {
        /*从fp所指向的文件读入数据存到info数组中*/
        fread(&info[i], sizeof(struct address_list), 1, fp);
        printf("%15s%20s%20s\n", info[i].name, info[i].adr,info[i].tel);
    }
    fclose(fp);                              /*关闭文件*/
}
int main()
{
    int i, n;                                /*变量类型为基本整型*/
    char filename[50];                        /*数组为字符型*/
    printf("how many ?\n");
    scanf("%d", &n);                        /*输入存入通信录信息的数量*/
    printf("please input filename:\n");
    scanf("%s", filename);                      /*输入文件名称*/
    printf("please input name,address,telephone:\n");
    for (i = 0; i < n; i++)                 /*输入信息*/
    {
        printf("NO%d", i + 1);
        scanf("%s%s%s", info[i].name, info[i].adr, info[i].tel);
        save(filename, n);                    /*调用函数save()*/
    }
    show(filename, n);                        /*调用函数show()*/
}
程序运行结果为:
how many ?
2
please input filename:
D:\demo.txt
please input name,address,telephone:
NO1
zhangsan
hebei
123456789
NO2
lisi
beijing
123123123
       zhangsan               hebei           123456789
           lisi             beijing           123123123

相关文章