C文件操作

第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*****************/
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值