💡 【教材】 ▲12 文件

This commit is contained in:
康建伟
2018-01-13 21:33:43 +08:00
parent 5742d51321
commit 7ca9aa9473
3 changed files with 301 additions and 0 deletions
@@ -0,0 +1,63 @@
/********************************
* *
* 文件夹: ▲12 文件 *
* *
* 文件名: MergeFile-main.c *
* *
* 内 容: 文件归并相关函数测试 *
* *
********************************/
#include <stdio.h>
#include "MergeFile.c" //**▲12 文件**//
int main(int argc, char *argv[])
{
FILE *f, *g, *h, *log;
printf("▼1\n▲函数 InitFile 测试...\n"); //1.函数InitFile测试
{
printf("作为示例,创建主文件 f 和事务文件 g ...\n");
f = fopen("main.file", "w+");
g = fopen("affair.file", "w+");
InitFile(f,g);
printf("\n");
}
PressEnter;
printf("▼2、3、4、5、6\n▲函数 MergeFile等 测试...\n"); //2、3、4、5、6.函数MergeFile等测试
{
printf("根据主文件 f 和事务文件 g 创建新文件 h ...\n");
f = fopen("main.file", "r");
g = fopen("affair.file", "r");
h = fopen("new.file", "w+");
MergeFile(f, g, h, log);
printf("\n");
}
PressEnter;
printf("▼7\n▲函数 Print 测试...\n"); //7.函数Print测试
{
FILE *fp;
printf("输出文件中记录...\n");
printf("◆主文件记录:");
fp = fopen("main.file", "r");
Print(fp, 0);
printf("◆事务文件记录:");
fp = fopen("affair.file", "r");
Print(fp, 1);
printf("◆新文件记录:");
fp = fopen("new.file", "r");
Print(fp, 0);
printf("◆错误日志记录:");
if((fp=fopen("ErrorLog.file", "r"))!=NULL)
Print(fp, 1);
printf("\n\n");
}
PressEnter;
system("del *.file");
return 0;
}
@@ -0,0 +1,172 @@
/***********************
* *
* 文件夹: ▲12 文件 *
* *
* 文件名: MergeFile.c *
* *
* 算 法: 12.1 *
* *
***********************/
#ifndef MERGEFILE_C
#define MERGEFILE_C
#include "MergeFile.h" //**▲12 文件**//
void InitFile(FILE *f, FILE *g)
{
MainFile fr[7] = {1,50,5,78,12,100,14,95,15,360,18,200,20,510}; //主文件
AffairFile gr[5] = {'I',8,+100,'U',12,-25,'U',14,+38,'D',18,-200,'I',21,+60}; //事务文件
fwrite(&fr[0], sizeof(fr[0]), 7, f);
fwrite(&gr[0], sizeof(AffairFile), 5, g);
fclose(f);
fclose(g);
}
int Situation(MainFile fr, AffairFile gr)
{
if(fr.key<gr.key) //情形1:复制"旧"主文件中的记录
return 1;
if(fr.key==gr.key)
{
if(gr.code=='D') //情形2:删除"旧"主文件记录,即不复制
return 2;
if(gr.code=='U') //情形3:更改"旧"主文件中记录
return 3;
}
if(fr.key>gr.key)
{
if(gr.code=='I') //情形4:插入事务到主文件
return 4;
}
return 0; //其他情形,返回错误
}
MainFile P(AffairFile gr)
{
MainFile tmp;
tmp.key = gr.key;
tmp.balance = gr.money;
return tmp;
}
MainFile Q(MainFile fr, AffairFile gr)
{
MainFile tmp;
tmp.key = fr.key;
tmp.balance = fr.balance + gr.money;
return tmp;
}
void Error(AffairFile gr, FILE *log) //事务文件发生错误
{
log = fopen("ErrorLog.file","a+");
fwrite(&gr, sizeof(AffairFile), 1, log); //将错误事务写入日志
fclose(log);
}
/*════╗
║算法12.1║
╚════*/
void MergeFile(FILE *f, FILE *g, FILE *h, FILE *log)
{
int tag, ftag, gtag;
MainFile fr, tmp; //主文件
AffairFile gr; //事务文件
ftag = gtag = 0;
ftag = fread(&fr, sizeof(MainFile), 1, f);
gtag = fread(&gr, sizeof(AffairFile), 1, g);
while(ftag==1&&gtag==1) //读取成功
{
tag = Situation(fr, gr);
switch(tag)
{
case 1: //复制"旧"主文件中记录
fwrite(&fr, sizeof(MainFile), 1, h);
ftag = fread(&fr, sizeof(MainFile), 1, f);
break;
case 2: //删除"旧"主文件记录,即不复制
ftag = fread(&fr, sizeof(MainFile), 1, f);
gtag = fread(&gr, sizeof(AffairFile), 1, g);
break;
case 3: //更改"旧"主文件中记录
tmp = Q(fr,gr);
fwrite(&tmp, sizeof(MainFile), 1, h); //函数Q将fr和gr归并成一个h结构的记录
ftag = fread(&fr, sizeof(MainFile), 1, f);
gtag = fread(&gr, sizeof(AffairFile), 1, g);
break;
case 4: //插入,函数P把gr加工为h的结构
tmp = P(gr);
fwrite(&tmp, sizeof(MainFile), 1, h);
gtag = fread(&gr, sizeof(AffairFile), 1, g);
break;
default:
Error(gr, log);
gtag = fread(&gr, sizeof(AffairFile), 1, g); //读取下一条事务
}
}
while(ftag==0&&gtag==1) //主文件读完
{
if(gr.code=='I') //只能是"插入"这种情形
{
tmp = P(gr);
fwrite(&tmp, sizeof(MainFile), 1, h);
}
else
Error(gr, log);
gtag = fread(&gr, sizeof(AffairFile), 1, g); //读取下一条事务
}
while(ftag==1&&gtag==0) //事务文件读完
{
fwrite(&fr, sizeof(MainFile), 1, h);
ftag = fread(&fr, sizeof(MainFile), 1, f);
}
fclose(f);
fclose(g);
fclose(h);
}
void Print(FILE *fp, int mark)
{
MainFile fr;
AffairFile gr;
if(mark==0) //输出文件记录
{
while(fread(&fr, sizeof(MainFile), 1, fp)==1)
printf("(%d%d) ", fr.key, fr.balance);
}
else //输出事务记录
{
while(fread(&gr, sizeof(AffairFile), 1, fp)==1)
printf("(%d%d%c) ", gr.key, gr.money, gr.code);
}
fclose(fp);
printf("\n");
}
#endif
@@ -0,0 +1,66 @@
/********************************
* *
* 文件夹: ▲12 文件 *
* *
* 文件名: MergeFile.h *
* *
* 内 容: 文件归并相关操作列表 *
* *
********************************/
#ifndef MERGEFILE_H
#define MERGEFILE_H
#include <stdio.h>
#include "../../▲01 绪论/Status.h" //**▲01 绪论**//
/* 文件类型定义 */
typedef struct //主文件
{
int key; //账号
int balance; //余额
}MainFile;
typedef struct //事务文件
{
char code; //操作:I-插入,D删去,U更改
int key; //账号
int money; //金额变动,存"+",取"-"
}AffairFile;
/* 文件归并函数列表 */
void InitFile(FILE *f, FILE *g);
/*━━━━━━━━━━━━━━━━━┓
┃(01)初始化一个主文件f和事务文件g。┃
┗━━━━━━━━━━━━━━━━━*/
int Situation(MainFile fr, AffairFile gr);
/*━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃(02)根据读到的主文件记录与事务记录,判断当前情形。┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━*/
MainFile P(AffairFile gr);
/*━━━━━━━━━━━━━━━━━━━━┓
┃(03)将事务记录类型转换为主文件记录类型。┃
┗━━━━━━━━━━━━━━━━━━━━*/
MainFile Q(MainFile fr, AffairFile gr);
/*━━━━━━━━━━━━━━━━┓
┃(04)根据事务记录修改主文件记录。┃
┗━━━━━━━━━━━━━━━━*/
void Error(AffairFile gr, FILE *log);
/*━━━━━━━━━━━━━━━━━━━┓
┃(05)将发生错误的事务记录写入日志文件。┃
┗━━━━━━━━━━━━━━━━━━━*/
void MergeFile(FILE *f, FILE *g, FILE *h, FILE *log);
/*━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃(06)算法12.1:归并主文件f和事务记录g到新的文件h。 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━*/
void Print(FILE *fp, int mark);
/*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃(07)输出记录,mark=0表示输出文件记录,mark=1表示输出事务记录。┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
#endif