PDA

View Full Version : Lư thuyết " Giáo tŕnh ngôn ngữ C Aptech"(Bài 21 : Quản lư tập tin)


x9nd
05-23-2009, 05:32 PM
Bài 21 : Quản lư tập tin

Mặc định
Bài 22 : Quản lư tập tin

* Đọc, ghi và truy cập dữ liệu trong tập tin:

Code:

#include <stdio.h>

struct cust_st
{
int acc_no;
char cust_nm[30];
float bal;
};

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. Printf 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=open("customer","a+"))==NULL)
{
printf("\nERROR opening customer file");
getch();
return;
}
while(flag=='y')
{
printf("\n\nEnter Account Number: ");
scanf("%d", &custdata.acc_no);
printf("\n\nEnter Customer Name: ");
scanf("%s", custdata.cust_nm);
printf("\n\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);
}

rectran()
{
FILE *fp1, *fp2;
char flag = 'y', found, val_flag;
struct cust_st custdata;
struct tran_st trandata;
int size = sizeof (struct cust_st);

clrscr();
if((fpl = fopen("customer","r+w"))==NULL)
{
printf("\nERROR opening customer file");
getch();
return;
}

if(fp2 = fopen("tran", "a+")==NULL)
{
printf("\nERROR opening transaction file");
getch();
return;
}

while(flag=='y')
{
printf("\n\nEnter Account number: ");
scanf("%d", &trandata.acc_no);
found='n';
rewind(fp1);
while((fread(&custdata, size, 1, fp)==1)&&(found=='n'))
{
if(custdata.acc_no == trandata.acc_no)
{
found = 'y';
break;
}
}
if(found=='y')
{
while(val_flag=='n')
{
printf("\nEnter Transaction type (D/W): ");
scanf("%c", &trandata.trantype);
if(trandata.trantype!='D' && trandata.trantype!='d' && trandata.trantype!='W' && trandata.trantype!='w')
printf("\t\tInvalid transaction type, please reenter");
else
val_flag = 'y';
}
val_flag ='n';
while(val_flag=='n')
{
printf("\nEnter amount: ");
scanf("%f", &trandata.amt);
if(trandata.trantype=='W' || trandata.trantype=='w')
{
if(trandata.amt > custdata.bal)
{
printf("\nAccount balance is %0.2f. Please reenter withdrawal amount.", custdata.bal);
}
else
{
custdata.bal -= trandata.amt;
val_flag = 'y';
}
}
else
{
custdata.bal += trandata.amt;
val_flag = 'y';
}
}
fwrite(&trandata, sizeof(struct tran_st), 1, fp2);
fseek(&custdata, size, 1, fp1);
}
else
printf("\nThis account number does not exist");
printf("\nRecord another transaction? (y/n): ");
scanf("%c", &flag);
}
fclose(fp1);
fclose(fp2);
}

prnlowbal()
{
FILE *fp;
struct cust_st custdata;
char flag='n';

clrscr();
if(fp = fopen("customer", "r")==NULL)
{
printf("\nERROR opening customer file");
getch();
return;
}

printf("\nReport on account balances below 250\n\n");
while(fread(&custdata, sizeof(struct cust_st), 1, fp))
{
if(custdata.bal < 250)
{
flag ='y';
printf("\n%d\t%s\t%.2f", custdata.acc_no, custdata.cust_nm, custdata.bal);
printf("\nNo Account balances found below 250");
}
getch();
fclose(fp);
}
}

Bài tập bắt buộc

- Viết một chương tŕnh C để hiển thị sự khác nhau giữa hai tập tin nhập vào như là đối số của ḍng lệnh. Với mỗi sự khác nhau, hiển thị vị trí t́m thấy sự khác nhau và các kư tự của hai tập tin tại vị trí đó. Cũng cần phải bảo đảm rằng người sử dụng đă nhập vào số lượng đối số hợp lệ. Cuối cùng hiển thị tổng số sự khác nhau đă t́m thấy. Để làm điều này:

a. Khai báo các biến argv và argc để nhận vào đối số từ ḍng lệnh.
b. Khai báo con trỏ đến hai tập tin.
c. Kiểm tra tính hợp lệ của argc để bảo đảm rằng đă nhập đúng số đối số.
d. Mở hai tập tin ở chế độ đọc.
e. Đặt một ṿng lặp để đọc từng kư tự từ hai tập tin cho đến khi cuối cả hai tập tin.
f. Nếu các kư tự là khác nhau, hiển thị chúng cùng với vị trí của chúng. Tăng số điểm sự khác nhau lên 1.
g. Nếu đi đến cuối của một tập tin, in các kư tự c̣n lại trong tập tin kia như là sự khác biệt.
h. Kiểm tra số đếm sự khác nhau để hiển thị các thông báo thích hợp.
i. Đóng hai tập tin.

Bài tập tự làm

1. Việt một chương tŕnh C để sao chép nội dung của một tập tin vào một tập tin khác loại trừ các từ a, an và the.
2. Viết một chương tŕnh C để nhập vào hai chuỗi số. Lưu trữ mỗi chuối ở hai tập tin riêng biệt. Sắp xếp chuỗi trong mỗi tập tin. Trộn hai chuỗi vào một, sắp xếp và lưu lại chuỗi kết quả vào một tập tin mới. Hiển thị nội dung của tập tin mới.