例13.3从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。
#include <stdio.h>
#define SIZE 4
struct student-type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
void save( )
{FILEfp;
int i;
if((fp=fopen("stu-list","wb"))==NULL)
{printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(struct student-type),1,fp)!=1)
printf("file write error\n");
fclose (fp);

main()
{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( );

在main函数中,从终端键盘输入4个学生的数据,然后调用save函数,将这些数据输出到以“stu-list”命名的磁盘文件中。fwrite函数的作用是将一个长度为29字节的数据块送到stu-list文件中(一个student-type类型结构体变量的长度为它的成员长度之和,即10+2+2+15=29)。运行情况如下:
输入4个学生的姓名、学号、年龄和地址:
Zhang 1001 19 room-101
Fun 1002 20 room-102
Tan 1003 21 room-103
Ling 1004 21 room-104
程序运行时,屏幕上并无输出任何信息,只是将从键盘输入的数据送到磁盘文件上。为了验证在磁盘文件“stu-list”中是否已存在此数据可以用以下程序从“stu-list”文件中读入数据,然后在屏幕上输出。
#include <stdio.h>
#define SIZE 4
struct student-type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
  main( )
{int i;
FILEfp;
fp=fopen("stu-list","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);

程序运行时不需从键盘输入任何数据。屏幕上显示出以下信息:
Zhang100119room-101
Fun 1002 20 room-102
Tan 1003 21 room-103
Ling 1004 21 room-104
请注意输入输出数据的状况。从键盘输入4个学生的数据是ASCII码,也就是文本文件。在送到计算机内存时,回车和换行符转换成一个换行符。再从内存以“wb”方式
(二进制写)输出到“stu-list”文件,此时不发生字符转换,按内存中存储形式原样输出到磁盘文件上。在上面验证程序中,又用fread函数从“stu-list”文件向内存读入数据,注意此时用的是“rb”方式,即二进制方式,数据按原样输入,也不发生字符转换。也就是这时候内存中的数据恢复到第一个程序向“stu-list”输出以前的情况。最后在验证程序中,用printf函数输出到屏幕,printf是格式输出函数,输出ASCII码,在屏幕上显示字符。换行符又转换为回车加换行符。