Bài 22 Qu n Lý T p Tin
M c tiêu:
K t thúc bài h c này, b n có th :ế
Th c hi n các thao tác trên t p tin văn b n và t p tin nh phân
M và đóng t p tin
Đ c t t p tin và ghi vào t p tin
S d ng con tr t p tin.
Các b c đ c cho trong bài này đ c gi i thích c n k , d hi u t duy c n th n t đ u đ nướ ượ ượ ư ế
cu i. Bài đã đ c vi t đ đáp ng đ c m c tiêu h c đ th hi u hoàn toàn v công c . Xin ượ ế ượ
hãy th c hi n theo các b c m t cách c n th n. ướ
Ph n I – Trong th i gian 1 gi 30 phút đ u:
22.1 Qu n lý t p tin trong C
C cung c p m t giao di n đ ng nh t cho vi c qu nnh p và xu t. Các ph ng pháp truy ươ
c p t p tin cũng gi ng nh các ph ng pháp qu n các thi t b khác. Gi i pháp cho tính ư ươ ế
đ ng nh t này là trong C không có ki u t p tin. C xem t t c các t p tin là stream.
22.1.1 Đ c, ghi và truy c p d li u trong t p tin
m t s hàm x t p tin trong t p tin header stdio.h. Chúng ta hãy vi t m t ch ng ế ươ
trình C s d ng nh ng hàm này. Ch ng trình t o m t h th ng ngân hàng đ n gi n. Các ươ ơ
chi ti t khách hàng đ c nh p vào l u trong m t t p tin g i ế ượ ư customer. Chi ti t c aế
các giao d ch nh g i ti n rút ti n đ c ki m tra h p l trên t p tin ư ượ customer. Các giao
d ch h p l đ c ghi nh n trong t p tin ượ trans. M t báo cáo v các khách hàng s v n
th p đ c in ra. Các b c đ c li t kê nh sau: ượ ướ ượ ư
1. Đ nh nghĩa m t structure đ l u tr d li u v khách hàng giao d ch. Câu ư
l nh s là:
struct cust_st
{ int acc_no;
char cust_nm[30];
float bal;
};
struct tran_st
{ int acc_no;
char trantype;
float amt;
};
2. Hi n th m t danh m c đ th c hi n các thao tác khác nhau d a trên l a ch n
c a ng i dùng. Câu l nh s là: ườ
while(choice != 4)
{ clrscr();
Qu n lý t p tin 49
printf("\nSelect choice from menu\n\n1. Accept
customer details\n2. Record Withdrawal/Deposit
transaction\n3. Print Low Balance Report\n4.
Exit\n\nEnter choice: ");
scanf(" %d", &choice);
.
.
}
3. G i các hàm t ng ng d a vào l a ch n c a ng i dùng. Câu l nh s là: ươ ườ
if(choice == 1)
addcust();
else if(choice == 2)
rectran();
else if(choice == 3)
prnlowbal();
4. Trong hàm thêm chi ti t c a khách hàng, đ nh nghĩa m t con tr t p tin đ k tế ế
h p v i t p tin customer. Khai báo m t bi n c u trúc đ nh p d li u c a khách hàng. ế
Câu l nh s là:
FILE *fp;
struct cust_st custdata;
5. M t p tin customer theo ch đ append đ th thêm các m u tin m i. Xácế
nh n r ng thao tác m t p tin đã đ c th c hi n. Câu l nh s là: ượ
if((fp = fopen("customer", "a+")) == NULL)
{ printf("\nERROR opening customer file");
getch();
return;
}
6. Nh p d li u khách hàng vào bi n c u trúc ghi d li u vào t p tin customer. ế
Câu l nh s là:
fwrite(&custdata, sizeof(struct cust_st), 1, fp);
7. Đóng t p tin customer sau khi nh p d li u. Câu l nh s là:
fclose(fp);
8. Trong hàm dùng đ ghi các giao d ch, đ nh nghĩa bi n con tr đ tr đ n t p tin ế ế
customer t p tin trans. đ nh nghĩa bi n c u trúc đ nh p vào d li u c a giao ế
d ch và đ c d li u khách hàng. Câu l nh s là:
FILE *fp1, *fp2;
struct cust_st custdata;
struct tran_st trandata;
9. M hai t p tin theo ch đ thích h p. T p tin ế customer ph i m đ đ c c p
nh t, trong khi t p tin trans ph i cho phép thêm các m u tin m i. Câu l nh s là:
if((fp1=fopen("customer", "r+w"))==NULL)
{ printf("\nERROR opening customer file");
50 L p trình c b n C ơ
getch();
return;
}
if((fp2 = fopen("trans", "a+")) == NULL)
{ printf("\nERROR opening transaction file");
getch();
return;
}
10. Nh p vào s tài kho n cho giao d ch b o đ m r ng t n t i trong t p tin
customer. Câu l nh s là:
while((fread(&custdata, size, 1, fp1)) == 1 && found == 'n')
{
if(custdata.acc_no == trandata.acc_no)
{ found='y';
break;
}
}
11. Đ b o đ m nh p vào m t ki u giao d ch h p l , câu l nh s là:
if(trandata.trantype!='D' && trandata.trantype!='d'
&& trandata.trantype!='W' && trandata.trantype!='w')
printf("\t\tInvalid transaction type, please reenter");
12. Đ i v i các giao d ch rút ti n, ph i b o đ m r ng s ti n rút ra ph i s n
trong tài kho n c a khách hàng. N u s n có, c p nh t s ti n còn l i trong tài kho n. ế
Cũng c n c p nh t s ti n trong tài kho n cho các giao d ch g i ti n. Câu l nh s là:
if(trandata.trantype=='W' || trandata.trantype=='w')
{
if(trandata.amt>custdata.bal)
printf("\nAccount balance is %.2f. Please
reenter withdrawal amount.", custdata.bal);
else
{
custdata.bal-=trandata.amt;
.
.
}
}
else
{
custdata.bal+=trandata.amt;
.
.
}
13. Ghi m u tin ch a giao d ch m i vào t p tin trans c p nh t m u tin c a khách
hàng trong t p tin customer. Câu l nh s là:
fwrite(&trandata, sizeof(struct tran_st), 1, fp2);
fseek(fp1, (long)(-size), 1);
Qu n lý t p tin 51
fwrite(&custdata, size, 1, fp1);
L u ý r ng trong su t quá trình ki m tra s tài kho n c a khách hàng, m u tin đ c cu iư
cùng c a khách hàng đang th c hi n giao d ch. v y, con tr t p tin c a t p tin
customer ph i n m cu i c a m u tin c n c p nh t. Con tr t p tin s đ c đ t l i ượ
v trí v đ u c a m u tin s d ng hàm fseek(). đây size là m t bi n s nguyên ch a ế
kích c c a c u trúc cho d li u khách hàng.
14. Đóng hai t p tin sau khi đã nh p giao d ch. Câu l nh s là:
fclose(fp1);
fclose(fp2);
15. Trong hàm hi n th các tài kho n s v n ít, đ nh nghĩa con tr t p tin đ k t ế
h p v i t p tin customer. Khai báo m t bi n c u trúc đ đ c d li u c a khách hàng. ế
Câu l nh s là:
FILE *fp;
struct cust_st custdata;
16. Sau khi m t p tin ch đ đ c, đ c m i m u tin khách hàng ki m tra s ế
v n. N u nó ít h n 250, in m u tin ra. Câu l nh s là: ế ơ
while((fread(&custdata, sizeof(struct cust_st), 1, fp))==1)
{ if(custdata.bal<250)
{.
.
printf("\n%d\t%s\t%.2f", custdata.acc_no,
custdata.cust_nm, custdata.bal);
}
}
17. Đóng t p tin customer. Câu l nh s là:
fclose(fp);
Chúng ta hãy nhìn vào ch ng trình hoàn ch nh.ươ
1.M ch ng trình so n th o mà b n dùng đ gõ ch ng trình C. ươ ươ
2. T o m t t p tin m i.
3. Gõ vào các dòng l nh sau đây:
#include<stdio.h>
struct cust_st
{ int acc_no;
char cust_nm[30];
float bal;
};
52 L p trình c b n C ơ
struct tran_st
{ int acc_no;
char trantype;
float amt;
};
void main()
{
int choice = 1;
while(choice != 4)
{ clrscr();
printf("\nSelect choice from menu\n\n1. Accept
customer details\n2. Record Withdrawal/Deposit
transaction\n3. Print Low Balance Report\n4.
Exit\n\nEnter choice: ");
scanf(" %d", &choice);
if(choice == 1)
addcust();
else if(choice == 2)
rectran();
else if(choice == 3)
prnlowbal();
}
}
addcust()
{
FILE *fp;
char flag = 'y';
struct cust_st custdata;
clrscr();
if((fp = fopen("customer", "a+")) == NULL)
{ printf("\nERROR opening customer file");
getch();
return;
}
while(flag == 'y')
{ printf("\n\nEnter Account number: ");
scanf(" %d", &custdata.acc_no);
printf("\nEnter Customer Name: ");
scanf("%s", custdata.cust_nm);
printf("\nEnter Account Balance: ");
scanf(" %f", &custdata.bal);
fwrite(&custdata, sizeof(struct cust_st), 1, fp);
printf("\n\nAdd another? (y/n): ");
scanf(" %c", &flag);
}
fclose(fp);
Qu n lý t p tin 53