第1关:使用FILE结构操作文本文件
#include <stdio.h>
#include <stdlib.h>
// 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中
extern void extractDigit();
// 请在此添加代码,实现extractDigit函数
// 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中
void extractDigit()
{
FILE *fi = fopen("a.txt","r"); // 以读的方式打开文件a.txt
FILE *fo = fopen("b.txt","w"); // 以写的方式打开文件b.txt
if(fi==NULL || fo==NULL) // 如果某个文件打开失败,则返回
return;
/**************Begin******************/
char readADigit(FILE *fi)// 从文件读取一个字符
{
char c = fgetc(fi);
if(c==EOF)
{
return EOF;
}
while(c>'9' || c<'0')// 如果不是数字字符,则继续读取下一个字符
{
c = fgetc(fi);
if(c==EOF)
{
return EOF;
}
}
return c;
}
char c;
int num=0,k=0;
c = readADigit(fi);// 从文件读取一个字符
while(c!=EOF)
{
num=num*10+c-'0';// 计算数字字符构成的整数
k++;
if(k==3)
{
fprintf(fo,"%d ",num);
k=0;
num=0;
}
c = readADigit(fi);
}
if(k!=0)// 如果有不到三位的数值,则写入文件b.txt
{
fprintf(fo,"%d ",num);
}
/**************End********************/
fclose(fi); // 关闭文件fi
fclose(fo); // 关闭文件fo
}
第2关:按格式读写文件存取学生信息
#include <stdio.h>
#include <stdlib.h>
#define COURSE_MAXNUM 5
//声明结构STUDENT
struct student
{
long studentID;
char studentName[20];
char sex[4];
struct{
int year;
int month;
int day;
}birthday;
float score[COURSE_MAXNUM];
float total;
float average;
int rank;
};
typedef struct student STUDENT;
//从文件fileName表示的文本文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/***********Begin*****************/
FILE *f1=fopen(fileName,"r");
if(f1==NULL)
{
printf("full");
return ;
}
int m,n;
int i;int j;
fscanf(f1,"%d %d",&n,&m);
for(i=0;i<n;i++)
{
fscanf(f1,"%ld%s%s%d-%d-%d",&stud[i].studentID,stud[i].studentName,stud[i].sex,&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day);
for(j=0;j<m;j++)
{
fscanf(f1,"%f",&stud[i].score[j]);
}
}
fclose(f1);
/***********End*******************/
}
//向文件fileName表示的文本文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
/***********Begin*****************/
FILE *fp1=fopen(fileName,"w");
if(fp1==NULL)
{
printf("full");
return;
}
int i,j,k;
fprintf(fp1,"%d %d\n",n,m);
for(j=1;j<=n;j++)
{
for(i=0;i<n;i++)
{
if(stud[i].rank==j)
{
fprintf(fp1,"%10ld %10s %s %d-%d-%d\t",stud[i].studentID,stud[i].studentName,stud[i].sex,stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day);
for(k=0;k<m;k++)
{
fprintf(fp1,"%.0f\t",stud[i].score[k]);
}
fprintf(fp1,"%.0f\t%.0f\t%d\t",stud[i].total,stud[i].average,stud[i].rank);
}
}
fprintf(fp1,"\n");
}
fclose(fp1);
/***********End*******************/
}
第3关:按数据块读写文件存取学生信息
#include <stdio.h>
#include <stdlib.h>
#define COURSE_MAXNUM 5
//声明结构STUDENT
struct student
{
long studentID;
char studentName[20];
char sex[4];
struct{
int year;
int month;
int day;
}birthday;
float score[COURSE_MAXNUM];
float total;
float average;
int rank;
};
typedef struct student STUDENT;
//从文件fileName表示的二进制文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/*************Begin***************/
FILE *fp = fopen(fileName,"r");
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
int n,m;
fread(&n,sizeof(n),1,fp);
fread(&m,sizeof(m),1,fp);
fread(stud,sizeof(STUDENT),n,fp);
fclose(fp);
/*************End*****************/
}
//向文件fileName表示的二进制文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
/*************Begin***************/
FILE *fp = fopen(fileName,"w");
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
fwrite(&m,sizeof(m),1,fp);
fwrite(stud,sizeof(STUDENT),n,fp);
fclose(fp);
/*************End*****************/
}