【例10.4load函数】从键盘输入数据,如果已有的数据以二进制形式存储在一个磁盘文件stu_list中,要求从其中读入数据并输出到stu.dat文件中,可以编写一个如下的load函数,从磁盘文件stu_list中读二进制数据,并存放在stud数组中。
例题10.4load函数:
#include<stdio.h>
#define SIZE 10
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
void save1()
{
FILE *fp;
int i;
if((fp=fopen("stu_list.dat","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);
}
void load2()
{
FILE *fp;
int i;
if((fp=fopen("stu_list.dat","rb"))==NULL)
{
printf("cannot open infile\n");
return;
}
for(i=0;i<SIZE;i++)
{
if(fread(&stud[i],sizeof(struct Student_type),1,fp)!=1)
{
if(feof(fp))
{
fclose(fp);
return;
}
printf("file read error!\n");
}
}
fclose(fp);
}
void save2()
{
FILE *fp;
int i;
if((fp=fopen("stu.dat","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);
}
int main()
{
int i;
printf("Please enter data of students:\n");
for(i=0;i<SIZE;i++)
{
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
}
save1();
load2();
save2();
return 0;
}
在VS2019下,需将源文件的fopen和scanf做些修改:
#include<stdio.h>
#define SIZE 10
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
void save1()
{
FILE* fp;
int i;
fopen_s(&fp, "stu_list.dat", "wb");
if (fp == 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);
}
void load2()
{
FILE* fp;
int i;
fopen_s(&fp, "stu_list.dat", "rb");
if (fp == NULL)
{
printf("cannot open infile\n");
return;
}
for (i = 0; i < SIZE; i++)
{
if (fread(&stud[i], sizeof(struct Student_type), 1, fp) != 1)
{
if (feof(fp))
{
fclose(fp);
return;
}
printf("file read error!\n");
}
}
fclose(fp);
}
void save2()
{
FILE* fp;
int i;
fopen_s(&fp, "stu.dat", "wb");
if (fp == 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);
}
int main()
{
int i;
printf("Please enter data of students:\n");
for (i = 0; i < SIZE; i++)
{
scanf_s("%s%d%d%s", stud[i].name, (unsigned int)sizeof(stud[i].name), &stud[i].num, &stud[i].age, stud[i].addr, (unsigned int)sizeof(stud[i].addr));
}
save1();
load2();
save2();
return 0;
}
例10.4把10个学生数据从磁盘文件读入,并在屏幕上输出:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
int main()
{
int i;
FILE *fp;
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
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);
return 0;
}
在VS2019下,需将源文件的fopen做些修改:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
int main()
{
int i;
FILE* fp;
fopen_s(&fp, "stu.dat", "rb");
if (fp == NULL)
{
printf("cannot open file\n");
exit(0);
}
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);
return 0;
}