8.3 文件系統(tǒng)應(yīng)用舉例
文件操作在程序設(shè)計中是非常重要的技術(shù),文件的數(shù)據(jù)格式不同,決定了對文件操作方式的不同。
[例8-10] 我們需要同時處理三個文件。文件addr.txt記錄了某些人的姓名和地址;文件tel.txt記錄了順序不同的上述人的姓名與電話號碼。希望通過對比兩個文件,將同一人的姓名、地址和電話號碼記錄到第三個文件addrtel.txt。首先看一下前兩個文件的內(nèi)容:
type addr.txt
hejie tianjing
liying shanghai
liming chengdu
wangpin chongqing
type tel.txt
liying 12345
hejie 8764
wangpin 87643
liming 7654322
這兩個文件格式基本一致,姓名字段占14個字符,家庭住址或電話號碼長度不超過14個字符,并以回車結(jié)束。文件結(jié)束的最后一行只有回車符,也可以說是長度為0的串。在兩個文件中,由于存放的是同一批人的資料,則文件的記錄數(shù)是相等的,但存放順序不同。我們可以任一文件記錄為基準(zhǔn),在另一文件中順序查找相同姓名的記錄,若找到,則合并記錄存入第三個文件,將查找文件的指針移到文件頭,以備下一次順序查找。
#include
#include
#include
#include
main( )
{
FILE *fptr1,*fptr2,*fptr3; /* 定義文件指針*/
char temp[15],temp1[15],temp2[15];
if ((fptr1=fopen("addr.txt","r"))==NULL)/*打開文件*/
{
printf("cannot open file");
exit(0);
}
if((fptr2=fopen("tel.txt","r"))==NULL)
{
printf("cannot open file");
exit(0);
}
if((fptr3=fopen("addrtel.txt","w"))==NULL)
{
printf("cannot open file");
exit(0);
}
clrscr(); /*清屏幕*/
while(strlen(fgets(temp1,15,fptr1))>1) /* 讀回的姓名字段長度大于1 */
{
fgets(temp2,15,fptr1); /* 讀地址*/
fputs(temp1, fptr3); /* 寫入姓名到合并文件*/
fputs(temp2, fptr3); /* 寫入地址到合并文件*/
strcpy(temp, temp1); /* 保存姓名字段*/
do /*查找姓名相同的記錄*/
{
fgets(temp1, 15, fptr2);
fgets(temp2, 15, fptr2);
}while(strcmp(temp,temp1)!=0);
rewind(fptr2); /* 將文件指針移到文件頭,以備下次查找*/
fputs(temp2, fptr3); /* 將電話號碼寫入合并文件*/
}
fclose(fptr1); /*關(guān)閉文件*/
fclose(fptr2);
fclose(fptr3);
}
程序運(yùn)行后,我們來看一下合并后的文件addrtel.txt的內(nèi)容:
type addrtel.txt
文件操作在程序設(shè)計中是非常重要的技術(shù),文件的數(shù)據(jù)格式不同,決定了對文件操作方式的不同。
[例8-10] 我們需要同時處理三個文件。文件addr.txt記錄了某些人的姓名和地址;文件tel.txt記錄了順序不同的上述人的姓名與電話號碼。希望通過對比兩個文件,將同一人的姓名、地址和電話號碼記錄到第三個文件addrtel.txt。首先看一下前兩個文件的內(nèi)容:
type addr.txt
hejie tianjing
liying shanghai
liming chengdu
wangpin chongqing
type tel.txt
liying 12345
hejie 8764
wangpin 87643
liming 7654322
這兩個文件格式基本一致,姓名字段占14個字符,家庭住址或電話號碼長度不超過14個字符,并以回車結(jié)束。文件結(jié)束的最后一行只有回車符,也可以說是長度為0的串。在兩個文件中,由于存放的是同一批人的資料,則文件的記錄數(shù)是相等的,但存放順序不同。我們可以任一文件記錄為基準(zhǔn),在另一文件中順序查找相同姓名的記錄,若找到,則合并記錄存入第三個文件,將查找文件的指針移到文件頭,以備下一次順序查找。
#include
#include
#include
#include
main( )
{
FILE *fptr1,*fptr2,*fptr3; /* 定義文件指針*/
char temp[15],temp1[15],temp2[15];
if ((fptr1=fopen("addr.txt","r"))==NULL)/*打開文件*/
{
printf("cannot open file");
exit(0);
}
if((fptr2=fopen("tel.txt","r"))==NULL)
{
printf("cannot open file");
exit(0);
}
if((fptr3=fopen("addrtel.txt","w"))==NULL)
{
printf("cannot open file");
exit(0);
}
clrscr(); /*清屏幕*/
while(strlen(fgets(temp1,15,fptr1))>1) /* 讀回的姓名字段長度大于1 */
{
fgets(temp2,15,fptr1); /* 讀地址*/
fputs(temp1, fptr3); /* 寫入姓名到合并文件*/
fputs(temp2, fptr3); /* 寫入地址到合并文件*/
strcpy(temp, temp1); /* 保存姓名字段*/
do /*查找姓名相同的記錄*/
{
fgets(temp1, 15, fptr2);
fgets(temp2, 15, fptr2);
}while(strcmp(temp,temp1)!=0);
rewind(fptr2); /* 將文件指針移到文件頭,以備下次查找*/
fputs(temp2, fptr3); /* 將電話號碼寫入合并文件*/
}
fclose(fptr1); /*關(guān)閉文件*/
fclose(fptr2);
fclose(fptr3);
}
程序運(yùn)行后,我們來看一下合并后的文件addrtel.txt的內(nèi)容:
type addrtel.txt