?? algo12-1.c
字號:
/* algo12-1.c 根據事務文件成批地更改主文件并得到一個新的主文件 */
#include"c1.h"
typedef struct RedType /* 主文件記錄類型 */
{
int accounts; /* 帳號 */
int amount; /* 余額 */
}RedType; /* 主文件記錄類型 */
typedef struct RcdType /* 事務文件記錄類型(比主文件記錄類型多了成員code) */
{
int accounts; /* 帳號 */
int amount; /* 存取的數量(存為+,取為-) */
char code; /* 修改要求(I:插入 U:修改 D:刪除) */
}RcdType; /* 事務文件記錄類型(比主文件記錄類型多了成員code) */
#define key accounts
RedType P(RcdType g)
{ /* 把g加工為q的結構返回 */
RedType q;
q.accounts=g.accounts;
q.amount=g.amount;
return q;
}
void Q(RedType *f,RcdType g)
{ /* 將f和g歸并成一個f結構的記錄 */
(*f).amount+=g.amount;
}
void MergeFile(FILE *f,FILE *g,FILE *h)
{ /* 由按關鍵字遞增有序的非空順序文件f和g歸并得到新文件h,三個文件均已 */
/* 打開,其中,f和g為只讀文件,文件中各附加一個最大關鍵字記錄, */
/* 且g文件中對該記錄的操作為插入。h為只寫文件。算法12.1 */
RedType fr,fn;
RcdType gr;
int i;
fread(&fr,sizeof(RedType),1,f);
fread(&gr,sizeof(RcdType),1,g);
while(!feof(f)||!feof(g))
{
if(fr.key<gr.key)
i=1;
else if(gr.code=='D'&&fr.key==gr.key)
i=2;
else if(gr.code=='I'&&fr.key>gr.key)
i=3;
else if(gr.code=='U'&&fr.key==gr.key)
i=4;
else
i=0;
switch(i)
{
case 1: /* 復制“舊”主文件中記錄 */
fwrite(&fr,sizeof(RedType),1,h);
if(!feof(f))
fread(&fr,sizeof(RedType),1,f);
break;
case 2: /* 刪除“舊”主文件中記錄,即不復制 */
if(!feof(f))
fread(&fr,sizeof(RedType),1,f);
if(!feof(g))
fread(&gr,sizeof(RcdType),1,g);
break;
case 3: /* 插入 */
fn=P(gr); /* 函數P把gr加工為h的結構 */
fwrite(&fn,sizeof(RedType),1,h);
if(!feof(g))
fread(&gr,sizeof(RcdType),1,g);
break;
case 4: /* 更改“舊”主文件中記錄 */
Q(&fr,gr); /* 函數Q將fr和gr歸并成一個h結構的記錄 */
fwrite(&fr,sizeof(RedType),1,h);
if(!feof(f))
fread(&fr,sizeof(RedType),1,f);
if(!feof(g))
fread(&gr,sizeof(RcdType),1,g);
break;
default:exit(ERROR); /* 其它均為出錯情況 */
}
}
}
void print(RedType t)
{
printf("%6d%4d\n",t.accounts,t.amount);
}
void printc(RcdType t)
{
printf("%6d%6d%8c\n",t.accounts,t.amount,t.code);
}
void main()
{
RedType c,a[8]={{1,50},{5,78},{12,100},{14,95},{15,360},{18,200},{20,510},{INT_MAX,0}}; /* 主文件數據 */
RcdType d,b[6]={{8,100,'I'},{12,-25,'U'},{14,38,'U'},{18,-200,'D'},{21,60,'I'},{INT_MAX,0,'U'}}; /* 已排序的事務文件數據 */
FILE *f,*g,*h;
int j;
f=fopen("old","wb"); /* 以寫的方式打開主文件old */
fwrite(a,sizeof(RedType),8,f); /* 將數組a中的數據寫入文件old */
fclose(f); /* 關閉文件old,形成主文件 */
f=fopen("change","wb"); /* 以寫的方式打開事務文件change */
fwrite(b,sizeof(RcdType),6,f); /* 將數組b中的數據寫入文件change */
fclose(f); /* 關閉文件change,形成已排序的事務文件 */
f=fopen("old","rb"); /* 以讀的方式打開主文件old */
printf("主文件內容:\n");
printf(" 帳號 余額\n");
do
{
j=fread(&c,sizeof(RedType),1,f);
if(j==1)
print(c); /* 輸出r的內容 */
}while(j==1);
rewind(f); /* 使f的指針重新返回文件的起始位置,以便重新讀入內存 */
g=fopen("change","rb"); /* 以讀的方式打開已排序的事務文件change */
printf("已排序的事務文件內容:\n");
printf(" 帳號 存取數量 修改要求\n");
do
{
j=fread(&d,sizeof(RcdType),1,g);
if(j==1)
printc(d); /* 輸出r的內容 */
}while(j==1);
rewind(g); /* 使g的指針重新返回文件的起始位置,以便重新讀入內存 */
h=fopen("new","wb"); /* 以寫的方式打開新主文件new */
MergeFile(f,g,h); /* 生成新主文件 */
fclose(f); /* 關閉文件old */
fclose(g); /* 關閉文件change */
fclose(h); /* 關閉文件new */
f=fopen("new","rb"); /* 以讀的方式打開新主文件new */
printf("新主文件內容:\n");
printf(" 帳號 余額\n");
do
{
j=fread(&c,sizeof(RedType),1,f);
if(j==1)
print(c); /* 輸出r的內容 */
}while(j==1);
fclose(f); /* 關閉文件new */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -