
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 và 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 và đ 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 n lý nh 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 lý 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ọ ậ ữ ệ ậ
Có m t s hàm x lý 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 và l u trong m t t p tin g i là ế ượ ậ ư ộ ậ ọ customer. Chi ti t c aế ủ
các giao d ch nh g i ti n và 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 có 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 và 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 đ có 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 và 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 và t p tin ậtrans. Và đ 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 và 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 và b o đ m r ng nó 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 cóố ớ ị ề ả ả ả ằ ố ề ả ẳ
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 và 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 là c a khách hàng đang th c hi n giao d ch. Vì 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 có 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 và 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

