C语言fread()和fwrite():以数据块的形式读写文件(附带实例)
C语言中,fputc() 和 fgetc() 函数每次只能处理文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,例如对一个结构体变量值进行读写。本节介绍实现整块数据读和写的 fread() 和 fwrite() 函数。
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 的值。
有以下几点说明:
- buffer:指针。对于 fwrite() 函数来说,其指向的是要输出数据的地址(起始地址);对 fread() 函数来说,其指向的是所要读入的数据的存放地址;
- size:要读写的字节数;
- count:要读写多少次 size 字节的数据项;
- fp:文件指针。
例如:
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
ICP备案:
公安联网备案: