Giáo trình Ngôn ngữ lập trình C++ (Phần 2)

Các đối của hàm có thể là:

• Biến cấu trúc, khi đó tham số thực t-ơng ứng là giá trị của cấu

trúc.

• Con trỏ cấu trúc, khiđó tham số thực t-ơng úng làđịa chỉ của

biến cấu trúc.

• Mảng cấu trúc hoặc con trỏ cấu trúc, khiđó tham số thực t-ơng

ứng là tên mảng cấu trúc.

Hàm có thể trả về:

• Giá trị của cấu trúc.

• Con trỏ cấu trúc.

pdf44 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1894 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Ngôn ngữ lập trình C++ (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 DOCFILE(char ttep[]) 
{ 
 int TT; 
 HOSO hs; 
 FILE *FR; 
 if ((FR = fopen(ttep, "rb"))==NULL) 
 { cout <<"\nLoi mo tep !"; return; } 
 TT = 1; 
 cout << "\n\tDANH SANH NHAN SU\n\n"; 
 while (fread(&hs,sizeof(HOSO),1,FR) > 0 ) 
 { 
 cout << setw(3) << TT << setw(25) << hs.hoten; 
 cout << setw(5) << hs.tuoi << endl; 
 TT += 1; 
 } 
 fclose(FR); 
} 
void main() 
{ 
 char tentep[12] = "HSNS.DAT"; 
 clrscr(); 
 NEWFILE(tentep); 
 DOCFILE(tentep); 
 getch(); 
} 
7.4. Nhập/xuất ngẫu nhiên và các hàm định vị con trỏ tệp 
7.4.1. Nhập/xuất ngẫu nhiên 
Một tệp đang mở có một con trỏ tệp để xác định vị trí đọc ghi trên tệp. 
Khi mở tệp để đọc hay ghi, con trỏ tệp luôn ở đầu tệp (byte 0). Nếu tệp đ−ợc 
mở theo mốt “a” thì con trỏ tệp ở đáy tệp để bổ sung thêm dữ liệu vào tệp. 
Việc nhập xuất dữ liệu đ−ợc bắt đầu từ vị trí hiện tại của con trỏ tệp, sau khi 
đọc ghi xong nó chuyển nó dịch chuyển một số byte bằng số byte đã đọc hay 
ghi. Việc nhập xuất nh− vậy đ−ợc tiến hành một cách tuần tự từ đầu tới cuối 
têp. 
 87
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
Vì con trỏ tệp định vị ở phần tử nào của tệp thì ta mới xử lý đ−ợc phần tử 
đó. Trong thực tế nhiều khi ta phải chuyển con trỏ tệp tới một phần tử bất kỳ 
trong tệp. Cách làm này gọi là truy nhập ngẫu nhiên, rất cần thiết cho nhiều 
thao tác xử lý trên tệp nh−: sửa chữa, hiệu chỉnh các bản ghi, chèn, bổ sung dữ 
liệu, tìm kiếm ... 
7.4.2. Các hàm định vị con trỏ tệp 
• Hàm rewind: 
 void rewind(FILE *fp); 
Hàm này chuyển con trỏ tệp của tệp fp về đầu tệp. 
• Hàm fseek: 
int fseek(FILE *fp, long sb, int xp); 
Trong đó: 
fp là con trỏ tệp. 
sb là số byte cần chuyển. 
xp cho biết vị trí xuất phát mà việc dịch chuyển đ−ợc bắt đầu từ đó. 
xp có thể nhận các giá trị sau: 
 xp = SEEK_SET hay 0 : xuất phát từ đầu tệp. 
 xp = SEEK_CUR hay 1 : xuất phát từ vị trí hiện tại của con trỏ 
 xp = SEEK_END hay 2 : xuất phát từ cuối tệp. 
Hàm này chuyển con trỏ tệp của tệp fp từ vị trí xác định bởi xp qua một 
sô byte bằng trị tuyệt đôí của sb. Nếu sb d−ơng là chuyển về phía cuối tệp, 
nếu sb âm thì chuyển về phía đầu tệp. 
Nếu thành công hàm trả về giá trị 0, nếu có lỗi hàm trả về giá trị khác 
không. 
Chú ý: Không dùng fseek đối với các tệp kiểu văn bản, vì việc chuyển ký 
tự sẽ làm cho sự định vị không chính xác. 
• Hàm ftell: 
long ftell(FILE *fp); 
Hàm cho biết vị trí hiện tại (byte thứ mấy) của con trỏ tệp của tệp fp. Số 
thứ thứ tự byte của tệp đ−ợc tính bắt đầu là 0. Nếu có lỗi hàm trả về –1L. 
 88
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
Ví dụ: Việc cài đặt hệ tạo lập các số liệu thống kê và quản trị dữ liệu này 
có thể đ−ợc thực hiện nh− sau : 
// DataBase - FILE4.CPP 
# include 
# include 
# include 
# include 
# include 
# include 
struct HOSO 
{ 
 char hoten[25]; 
 int tuoi; 
}; 
void NEWFILE(char *ttep) 
{ 
 HOSO hs; 
 FILE *FW; 
 char ok; 
 FW = fopen(ttep, "wb"); 
 while (1) 
 { 
 cout << "\nHo va ten : "; gets(hs.hoten); 
 cout > hs.tuoi; 
 cout > ok; 
 fwrite(&hs, sizeof(HOSO), 1, FW); 
 if (ok=='k' || ok == 'K') break; 
 } 
 fclose(FW); 
} 
void FORMAT(int n) 
{ 
 cout.setf(ios::showpoint); 
 89
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 cout << setprecision(n) << setiosflags(ios::fixed); 
} 
void space(int n) 
{ for (int k=1; k<=n; k++) cout << " "; } 
void inst(char *st, int dd1) 
{ 
 int dd = strlen(st); 
 if (dd < dd1) 
 { 
 dd = dd1 - dd; 
 cout << st; 
 space(dd); 
 } 
 else cout << st; 
} 
void DOCFILE(char *ttep) 
{ 
 HOSO hs; 
 FILE *FR; 
 if ((FR = fopen(ttep, "rb"))==NULL) 
 { cout <<"\nTep chua nhap DL"; return; } 
 cout << "\n DANH SACH CAN BO - CNV\n"; 
 int TT = 1; 
 while (fread(&hs, sizeof(HOSO), 1, FR) > 0 ) 
 { 
 cout << "\n" << setw(3) << TT << " "; 
 inst(hs.hoten, 25); 
 cout << setw(3) << hs.tuoi; 
 TT = TT+1; 
 } 
 fclose(FR); 
} 
 90
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
void APPEND(char *ttep) 
{ 
 HOSO hs; 
 char ok; 
 FILE *FW; 
 if ((FW = fopen(ttep, "ab"))==NULL) 
 { 
 cout <<"\nTep chua ton tai"; 
 getch(); 
 return; 
 } 
 fseek(FW, 0, SEEK_END); 
 int n = ftell(FW)/sizeof(hs) + 1; 
 while (1) 
 { 
 cout << "\nNhap ban ghi so : " << n; 
 cout << "\nHo va ten : "; gets(hs.hoten); 
 cout > hs.tuoi; 
 fwrite(&hs, sizeof(hs), 1, FW); 
 cout > ok; 
 n = n + 1; 
 if (ok=='k' || ok == 'K') break; 
 } 
 fclose(FW); 
} 
void EDIT(char *ttep) 
{ 
 HOSO hs; 
 char ok; long i,n; 
 FILE *FW; 
 if ((FW = fopen(ttep, "r+b"))==NULL) 
 { 
 cout <<"\nTep chua nhap DL"; 
 getch(); 
 return; 
 } 
 91
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 fseek(FW, 0, SEEK_END); 
 n = ftell(FW)/sizeof(hs); 
 while (1) 
 { cout << "\nSua ban ghi thu (<= " << n << ") "; 
 cin >> i; 
 int m = i-1; 
 if (i > 0 && i<=n) 
 { 
 fseek(FW, m*sizeof(hs), SEEK_SET); 
 fread(&hs, sizeof(hs), 1, FW); 
 cout << "\nHo va ten : " << hs.hoten 
 << "\nTuoi : " << hs.tuoi; 
 cout << "\n\nSua lai :"; 
 cout << "\nHo va ten : "; gets(hs.hoten); 
 cout > hs.tuoi; 
 cout > ok; 
 if (ok=='c' || ok == 'C') 
 { 
 fseek(FW, m*sizeof(hs), SEEK_SET); 
 fwrite(&hs, sizeof(hs), 1, FW); 
 } 
 cout << "\nCo sua nua khong ? (C/K) "; 
 cin >> ok; 
 if (ok=='k' || ok == 'K') break; 
 } 
 } 
 fclose(FW); 
} 
void INSERT(char *ttep) 
{ 
 HOSO hs, hstg; 
 char ok; long i,n; 
 FILE *FR, *ftg; 
 if ((FR = fopen(ttep, "rb"))==NULL) 
 92
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 { 
 cout <<"\nTep chua nhap DL"; 
 getch(); 
 return; 
 } 
 fseek(FR, 0, SEEK_END); 
 n = ftell(FR)/sizeof(hs); 
 while (1) 
 { cout << "\nChen vao sau ban ghi thu (<= " 
 << n << ") "; 
 cin >> i; 
 int m = i-1; 
 if (i > 0 && i<=n) 
 { 
 fseek(FR, 0, SEEK_SET); 
 ftg = fopen("FTG.dat", "wb"); 
 int TT = 0; 
 while (fread(&hs, sizeof(HOSO), 1, FR) > 0 ) 
 { 
 fwrite(&hs, sizeof(HOSO), 1, ftg); 
 if (TT == m) 
 { 
 cout << "\nVao du lieu can chen:"; 
 cout << "\nHo va ten : "; 
gets(hstg.hoten); 
 cout << "Tuoi : "; 
cin >> hstg.tuoi; 
 fwrite(&hstg, sizeof(HOSO), 1, ftg); 
 } 
 TT = TT+1; 
 } 
 cout << "\nCo chen nua khong ? (C/K) "; 
 cin >> ok; 
 if (ok=='k' || ok == 'K') break; 
 } 
 } 
 fclose(FR); 
 fclose(ftg); 
 93
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 remove(ttep); 
 rename("FTG.DAT", ttep); 
} 
void TIMTEN(char *ttep) 
{ 
 HOSO hs; 
 char ok; long i,n; 
 FILE *FR; 
 if ((FR = fopen(ttep, "rb"))==NULL) 
 { 
 cout <<"\nTep chua nhap DL"; 
 getch(); 
 return; 
 } 
 char ht[25]; int td; 
 while (1) 
 { 
 fseek(FR, 0, SEEK_SET); 
 cout << "\nVao ho va ten can tim : "; gets(ht); 
 td = 0; 
 while (fread(&hs, sizeof(HOSO), 1, FR) > 0 ) 
 if (strcmpi(hs.hoten, ht) == 0) 
 { 
 cout << "\nHo va ten : " << hs.hoten 
 << "\nTuoi : " << hs.tuoi; 
 td = 1; 
 } 
 if (td==0) cout << "\nKhong co " << ht; 
 cout > ok; 
 if (ok=='k' || ok == 'K') break; 
 } 
 fclose(FR); 
} 
 94
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
void HUYBO(char *ttep) 
{ 
 HOSO hs; 
 char ok; long i,n; 
 FILE *FR, *ftg; 
 if ((FR = fopen(ttep, "rb"))==NULL) 
 { cout <<"\nTep chua nhap DL"; 
 getch(); 
 return; 
 } 
 fseek(FR, 0, SEEK_END); 
 n = ftell(FR)/sizeof(hs); 
 while (1) 
 { cout << "\nHuy bo ban ghi thu (<= " << n << ") "; 
 cin >> i; 
 int m = i-1; 
 if (i > 0 && i<=n) 
 { 
 fseek(FR, m*sizeof(hs), SEEK_SET); 
 fread(&hs, sizeof(hs), 1, FR); 
 cout << "\nHo va ten : " << hs.hoten 
 << "\nTuoi : " << hs.tuoi; 
 fseek(FR, 0, SEEK_SET); 
 cout > ok; 
 if (ok=='c' || ok == 'C') 
 { 
 ftg = fopen("FTG.dat", "wb"); 
 int TT = 0; 
 while (fread(&hs, sizeof(HOSO), 1, FR)>0) 
 { 
 if (TT != m) 
 fwrite(&hs, sizeof(HOSO), 1, ftg); 
 TT = TT+1; 
 } 
 } 
 cout << "\nCo huy bo nua khong ? (C/K) "; 
 cin >> ok; 
 95
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 if (ok=='k' || ok == 'K') break; 
 } 
 } 
 fclose(FR); 
 fclose(ftg); 
 remove(ttep); 
 rename("FTG.DAT", ttep); 
} 
void MENU() 
{ 
 clrscr(); 
 cout << "\n1. Tao tep DL " 
 << "\n2. Xem du lieu " 
 << "\n3. Sua du lieu " 
 << "\n4. Bo sung DL " 
 << "\n5. Chen ban ghi" 
 << "\n6. Tim theo ten" 
 << "\n7. Huy bo DL " 
 << "\n8. Ket thuc \n" 
 << "\n Ban chon ?"; 
} 
void PROMPT() { cout << "\nNhap ten tep DL : "; } 
void main() 
{ 
 char *tt; 
 while (1) 
 { 
 MENU(); 
 char key = getch(); 
 switch (key) 
 { case '1': PROMPT(); cin >> tt; 
 NEWFILE(tt); break; 
 case '2': PROMPT(); cin >> tt; DOCFILE(tt); 
 getch(); break; 
 case '3': PROMPT(); cin >> tt; 
 96
Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin 
 Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 
 97
 EDIT(tt); break; 
 case '4': PROMPT(); cin >> tt; 
 APPEND(tt); break; 
 case '5': PROMPT(); cin >> tt; 
 INSERT(tt); break; 
 case '6': PROMPT(); cin >> tt; 
 TIMTEN(tt); break; 
 case '7': PROMPT(); cin >> tt; 
 HUYBO(tt); break; 
 case '8': exit(0); 
 } 
 } 
} 

File đính kèm:

  • pdfGiáo trình Ngôn ngữ lập trình C++ (Phần 2).pdf