C语言fread函数和fwrite函数的用法及其实例

C 语言 fpintf、fscanf 函数与 printf、scanf 函数作用相仿,都是格式化读写函数。只有一

点不同:fprintf 函数和 fscanf 函数的读写对象不是终端而是磁盘文件,一般调用方式为

fprintf(文件指针,格式化化字符串,输出列表);

fscanf(文件指针,格式化字符串,输入表列);

例如:

fprintf(fp,"%d,%6.2",i,t);

它的作用是将整形变量 i 和实型变量 t 的值按 %d 和 %6.2f 的格式输出到 fp 指向的文

件上。

用 fprintf 和 fscanf 函数对磁盘文件进行读写,使用很方便,易于理解,但在输入时要

将 ASCII 码转换为二进制形式, 在输出时又要将二进制形式转换成字符, 花费的时间比较多。 因此 ,

在内存与磁盘文件频繁交换的情况下最好用 fread 和 fwrite 函数。

putw 和 getw 函数用来对磁盘文件读写一个字。如:putw(10,fp) ;

作用是将整数 10 输出到 fp 所指的向的文件。

这两函数的定义如下:

putw 函数:

int putw(int i, FILE* fp)

{

char * s;

int count;

s = (char*) &i;

for(count = 0; count < sizeof(int); count++)

putc(s[count], fp);

return (i);

}

int getw(FILE * fp)

{

char * s;

int i, count;

s = (char *) &i; //是 s 指向 i 的起始地址

for(count = 0; count < sizeof(int); count++)

s[count] = getc(fp);

return (i);

}

void getfloat(float num, FILE * fp)

{

char * s;

int count;

s = (char*) &num;

for(count = 0; count < 4; count++)

putc(s[count], fp);

}

C 语言中,用 getc 和 putc 函数可以对读写文件中的一个字符。但常常要求一次读入一组数

据,ANSI C 标准提出设置两个函数(fread 和 fwrite) ,用来读写一个数据块,它的一般调用

形式为

fread(buffer, size, count, fp);

fwrite(buffer, size, count, fp);

其中:

buffer:是一个指针。对 fread 来说,它是读入数据的存放地址。对 fwrite 来说,是要

输出数据的地址(是指起始地址) 。

size:是要读写的字节数。

count:是要进行读写多少个 size 字节的数据项。

fp:文件指针。

如果文件二进制形式打开,用 fread 和 fwrite 函数就可以读写任何类型的信息。

下面是一个完整的例子

从键盘输入 4 个学生的有关数据,然后把它们转存到磁盘文件上去,接着把它们输出到终端 。

#include <stdio.h>

#include <stdlib.h>

#define SIZE 4

struct student_type

{

char name[20];

int num;

int age;

char addr[15];

}stud[SIZE];

void save()

{

FILE * fp;

int i;

if ((fp = fopen("D:\\stu_list.txt", "wb")) == NULL)

{

printf("cannot open file\n");

exit(1);

}

for (i = 0; i < SIZE; i++)

{

if(fwrite(&stud[i], sizeof(struct student_type), 1, fp) != 1)

printf("file write error.\n");

}

fclose(fp);

}

void main()

{

printf("sizeof(struct stud) = %d\n", sizeof(student_type));

printf("Please input the 4 student information,including

name,num,age,address\n");

int i;

for(i = 0; i < SIZE; i++)

scanf("%s%d%d%s", stud[i].name, &stud[i].num, &stud[i].age,

stud[i].addr);

save();

printf("\nThe information of the 4 students is:\n");

FILE* fp;

fp = fopen("D:\\stu_list.txt", "rb");

for (i = 0; i < SIZE; i++)

{

fread(&stud[i], sizeof(struct student_type), 1, fp);

printf("%-10s %4d %4d %-15s\n", stud[i].name, stud[i].num,

stud[i].age, stud[i].addr);

}

fclose(fp);

}