Nhập môn Lập trình - Bài 13: Tập tin - Đặng Bình Phương

Khái niệm

 C lưu dữ liệu (biến, mảng, cấu trúc, ) trong

bộ nhớ RAM.

 Dữ liệu được nạp vào RAM và gửi ra ngoài

chương trình thông qua các thiết bị (device)

• Thiết bị nhập (input device): bàn phím, con chuột

• Thiết bị xuất (output device): màn hình, máy in

• Thiết bị vừa nhập vừa xuất: tập tin

 Các thiết bị đều thực hiện mọi xử lý thông

qua các dòng (stream).

pdf48 trang | Chuyên mục: Lập Trình | Chia sẻ: tuando | Lượt xem: 417 | Lượt tải: 2download
Tóm tắt nội dung Nhập môn Lập trình - Bài 13: Tập tin - Đặng Bình Phương, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 ghi. 
Thất bại: trả về EOF. 
char s[] = “Ky thuat lap trinh”; 
FILE* fp = fopen(“taptin.txt”, “wt”); 
if (fp != NULL) 
 fputs(s, fp); 
int fputs(const char *str, FILE *fp) 
VC 
& 
BB 
26 
Hàm xuất trực tiếp 
Tập tin 
Ghi count mẫu tin có kích thước mỗi mẫu 
tin là size (byte) từ vùng nhớ buf vào 
stream fp (theo kiểu nhị phân). 
Thành công: trả về số lượng mẫu tin 
(không phải số lượng byte) đã ghi. 
Thất bại: số lượng nhỏ hơn count. 
int a[] = {1, 2, 3}; 
FILE* fp = fopen(“taptin.dat”, “wb”); 
if (fp != NULL) 
 fwrite(a, sizeof(int), 3, fp); 
int fwrite(void *buf, int size, int count, FILE *fp) 
VC 
& 
BB 
27 
Hàm nhập trực tiếp 
Tập tin 
Đọc count mẫu tin có kích thước mỗi mẫu 
tin là size (byte) vào vùng nhớ buf từ 
stream fp (theo kiểu nhị phân). 
Thành công: trả về số lượng mẫu tin 
(không phải số lượng byte) thật sự đã đọc. 
Thất bại: số lượng nhỏ hơn count khi kết 
thúc stream fp hoặc gặp lỗi. 
int a[5]; 
FILE* fp = fopen(“taptin.dat”, “wb”); 
if (fp != NULL) 
 fread(a, sizeof(int), 3, fp); 
int fread(void *buf, int size, int count, FILE *fp) 
VC 
& 
BB 
28 
Hàm đóng tập tin xác định 
Tập tin 
Đóng stream fp. 
Dữ liệu trong stream fp sẽ được “vét” (ghi 
hết lên đĩa) trước khi đóng. 
Thành công: trả về 0. 
Thất bại: trả về EOF. 
FILE* fp = fopen(“taptin.txt”, “rt”); 
fclose(fp); 
int fclose(FILE *fp) 
VC 
& 
BB 
29 
Hàm đóng tất cả stream 
Tập tin 
Đóng tất cả stream đang được mở ngoại trừ 
các stream chuẩn stdin, stdout, stdprn, 
stderr, stdaux. 
Nên đóng từng stream thay vì đóng tất cả. 
Thành công: trả về số lượng stream được 
đóng. 
Thất bại: trả về EOF. 
FILE* fp1 = fopen(“taptin1.txt”, “rt”); 
FILE* fp2 = fopen(“taptin2.txt”, “wt”); 
fcloseall(); 
int fcloseall() 
VC 
& 
BB 
30 
“Vét” dữ liệu trong stream 
Khi chương trình kết thúc, các stream đang mở 
sẽ được “vét” (flush) và đóng lại. Tuy nhiên, ta 
nên đóng một các tường minh các stream sau 
khi sử dụng xong (nhất là các stream tập tin) để 
tránh các sự cố xảy ra trước khi chương trình 
kết thúc bình thường. 
Ta có thể “vét” dữ liệu trong stream mà không 
cần đóng stream đó bằng một trong hai hàm: 
 Vét stream fp xác định: int fflush(FILE *fp); 
 Vét tất cả stream đang mở: int flushall(); 
Tập tin 
VC 
& 
BB 
31 
Con trỏ chỉ vị (position indicator) 
Khái niệm 
 Được tạo tự động khi mở tập tin. 
 Xác định nơi diễn ra việc đọc/ghi trong tập tin 
Vị trí con trỏ chỉ vị 
 Khi tập tin chưa mở: ở đầu tập tin (giá trị 0). 
 Khi mở tập tin: 
• Ở cuối tập tin khi mở để chèn (mode a hay a+) 
• Ở đầu tập tin (hay giá trị 0) khi mở với các mode 
khác (w, w+, r, r+). 
Tập tin 
VC 
& 
BB 
32 
Truy xuất tuần tự & ngẫu nhiên 
Truy xuất tuần tự (sequentially access) 
 Phải đọc/ghi dữ liệu từ vị trí con trỏ chỉ vị đến 
vị trí n-1 trước khi đọc dữ liệu tại vị trí n. 
 Không cần quan tâm đến con trỏ chỉ vị do con 
trỏ chỉ vị tự động chuyển sang vị trí kế tiếp 
sau thao tác đọc/ghi dữ liệu. 
Truy xuất ngẫu nhiên (random access) 
 Có thể đọc/ghi tại vị trí bất kỳ trong tập tin 
mà không cần phải đọc/ghi toàn bộ dữ liệu 
trước đó  quan tâm đến con trỏ chỉ vị. 
Tập tin 
VC 
& 
BB 
33 
Hàm đặt lại vị trí con trỏ chỉ vị 
Tập tin 
Đặt lại vị trí con trỏ chỉ vị về đầu (byte 0) 
tập tin fp. 
Không 
FILE* fp = fopen(“taptin.txt”, “w+”); 
fprintf(fp, “0123456789”); 
rewind(fp); 
fprintf(fp, “*****”); 
void rewind(FILE *fp) 
VC 
& 
BB 
34 
Hàm tái định vị con trỏ chỉ vị 
Tập tin 
Đặt vị trí con trỏ chỉ vị trong stream fp với 
vị trí offset so với cột mốc origin (SEEK_SET 
hay 0: đầu tập tin; SEEK_CUR hay 1: vị trí 
hiện tại; SEEK_END hay 2: cuối tập tin) 
Thành công: trả về 0. 
Thất bại: trả về giá trị khác 0. 
FILE* fp = fopen(“taptin.txt”, “w+”); 
fseek(fp, 0L, SEEK_SET); //  rewind(fp); 
fseek(fp, 0L, SEEK_END); // cuối tập tin 
fseek(fp, -2L, SEEK_CUR);// lùi lại 2 vị trí 
int fseek(FILE *fp, long offset, ing origin) 
VC 
& 
BB 
35 
Hàm xác định vị trí con trỏ chỉ vị 
Tập tin 
Hàm trả về vị trí hiện tại của con trỏ chị vị 
(tính từ vị trí đầu tiên của tập tin, tức là 0) 
của stream fp. 
Thành công: trả về vị trí hiện tại của con 
trỏ chỉ vị. 
Thất bại: trả về -1L. 
FILE* fp = fopen(“taptin.txt”, “rb”); 
fseek(fp, 0L, SEEK_END); 
long size = ftell(fp); 
printf(“Kich thuoc tap tin la %ld\n”, size); 
long ftell(FILE *fp) 
VC 
& 
BB 
36 
Dấu hiệu kết thúc tập tin 
Khi đã biết kích thước tập tin 
 Sử dụng fwrite để lưu n mẫu tin 
 kích thước = n * sizeof(1 mẫu tin); 
 Sử dụng hàm fseek kết hợp hàm ftell 
Khi chưa biết kích thước tập tin 
 Hằng số EOF (=-1) (chỉ cho tập tin văn bản) 
  while ((c = fgetc(fp)) != EOF)  
 Hàm int feof(FILE *fp) (cho cả 2 kiểu tập tin) 
  trả về số 0 nếu chưa đến cuối tập tin 
 trả về số khác 0 nếu đã đến cuối tập tin. 
Tập tin 
VC 
& 
BB 
37 
Các hàm quản lý tập tin 
Hàm nhập xuất tập tin (File I/O function) là các 
đã đề cập phần trước 
 Mở và đóng tập tin: fopen, fclose 
 Nhập/Xuất tập tin: 
• Theo định dạng: fprintf, fscanf 
• Từng ký tự hay chuỗi: fputc, fputs, fgetc, fgets 
• Trực tiếp từ bộ nhớ: fwrite, fread 
Hàm quản lý tập tin (File-Management function) 
 Xóa tập tin: remove 
 Đổi tên tập tin: rename 
Tập tin 
VC 
& 
BB 
38 
Hàm xóa tập tin 
Tập tin 
Xóa tập tin xác định bởi filename. 
 Thành công: trả về 0. 
 Thất bại: trả về -1. 
if (remove(“c:\\vc.txt”) == 0) 
 printf(“Tap tin vc.txt da bi xoa!”); 
else 
 printf(“Ko xoa duoc tap tin vc.txt!”); 
int remove(const char *filename) 
VC 
& 
BB 
39 
Hàm đổi tên tập tin 
Tập tin 
Đổi tên tập tin oldname thành newname. 
Hai tập tin phải cùng ổ đĩa nhưng không 
cần thiết phải cùng thư mục (có thể sử 
dụng để di chuyển hay sao chép tập tin). 
Thành công: trả về 0. 
Thất bại: trả về -1. 
if (rename(“c:\\a.txt”, “c:\\BT\b.cpp”) == 0) 
 printf(“Doi ten tap tin thanh cong”); 
else 
 printf(“Doi ten tap tin that bai”); 
int rename(const char *oldname, const char *newname) 
VC 
& 
BB 
40 
Bài tập lý thuyết 
Bài 1: Sự khác nhau giữa stream kiểu văn bản 
và stream kiểu nhị phân? 
  Stream văn bản tự động chuyển đổi ký tự „\n‟ 
thành cặp ký tự CR-LF trong khi stream nhị phân 
không thực hiện việc chuyển đổi này (xem mọi 
ký tự đều như nhau). 
Bài 2: Cần phải làm gì trước khi muốn truy xuất 
tập tin? 
  Mở tập tin (tạo stream kết nối với tập tin cần 
mở) bằng hàm fopen. 
Tập tin 
VC 
& 
BB 
41 
Bài tập lý thuyết 
Bài 3: Khi mở tập tin bằng fopen, ta cần phải 
xác định thông tin nào và hàm sẽ trả về cái gì? 
  Cần xác định tên tập tin cần mở và mode mở 
tập tin này. Hàm sẽ trả về một con trỏ đến kiểu 
FILE, con trỏ này được dùng thay cho tập tin 
trong chương trình. 
Bài 4: Ba phương pháp để truy xuất tập tin? 
  1. Theo định dạng. 
  2. Theo ký tự / chuỗi ký tự. 
  3. Trực tiếp từ bộ nhớ. 
Tập tin 
VC 
& 
BB 
42 
Bài tập lý thuyết 
Bài 5: Hai phương pháp để đọc thông tin từ tập 
tin là gì? 
  1. Truy xuất tuần tự (theo thứ tự) 
  2. Truy xuất ngẫu nhiên (tại vị trí bất kỳ) 
Bài 6: Giá trị của EOF? 
  -1 (định nghĩa trong STDIO.H) 
Bài 7: Ta dùng hằng ký hiệu EOF để làm gì? 
  Được sử dụng với các tập tin kiểu văn bản 
nhằm xác định dấu hiệu cuối tập tin. 
Tập tin 
VC 
& 
BB 
43 
Bài tập lý thuyết 
Bài 8: Cách xác định cuối tập tin trong kiểu văn 
bản và kiểu nhị phân? 
  Sử dụng hàm foef cho cả hai kiểu tập tin. 
Trong kiểu văn bản có thể sử dụng hằng EOF. 
Bài 9: Con trỏ chỉ vị là gì và cách thay đổi nó? 
  Con trỏ chỉ vị đánh dấu vị trí trong của một 
tập tin, nơi diễn ra các thao tác đọc/ghi. 
  Thay đổi vị trí con trỏ chỉ vị bằng hàm rewind 
(về đầu tập tin) và fseek (về vị trí bất kỳ). 
Tập tin 
VC 
& 
BB 
44 
Bài tập lý thuyết 
Bài 10: Nếu mở một tập tin chưa có (bằng mode 
w), cho biết giá trị của con trỏ chị vị lúc đầu? 
  Con trỏ chỉ vị chỉ đến ký tự đầu tiên của tập 
tin (vị trí 0). 
Bài 11: Viết lệnh đóng tất cả các stream tập tin. 
  fcloseall(); 
Bài 12: Trình bày hai cách khác nhau để chuyển 
con trỏ chỉ vị về đầu tập tin fp. 
  1. rewind(fp); 
  2. fseek(fp, 0, SEEK_SET); 
Tập tin 
VC 
& 
BB 
45 
Bài tập lý thuyết 
Bài 13: Đoạn chương trình sau có sai không? 
Tập tin 
void main() 
{ 
 FILE *fp; 
 int c; 
 if ((fp = fopen(“abc.xyz”, “rb”)) == NULL) 
 printf(“Khong mo duoc tap abc.xyz\n”); 
 else 
 { 
 while ((c = fgetc(fp)) != EOF) 
 fprintf(stdout, “%c”, c); 
 fclose(fp); 
 } 
} 
VC 
& 
BB 
46 
Bài tập thực hành 
Bài 14: Viết chương trình ghi 3 số nguyên a, b, c 
được nhập từ bàn phím vào một tập tin. 
Bài 15: Viết chương trình đọc 3 số nguyên a, b, 
c từ một tập tin, sau đó giải phương trình ax2+ 
bx + c = 0 rồi ghi kết quả vào một tập tin khác. 
Bài 16: Viết chương trình đọc n số nguyên từ 
một tập tin cho trước, sau đó sắp xếp tăng dần 
rồi ghi kết quả vào 1 tập tin khác. Ví dụ: 
 4  4 
 2 5 1 4  1 2 4 5 
Tập tin 
VC 
& 
BB 
47 
Bài tập thực hành 
Bài 17: Viết chương trình ghi các dòng văn bản 
được nhập từ bàn phím lên tập tin. 
Bài 18: Viết chương trình in nội dung một tập tin 
lên màn hình. 
Bài 19: Viết chương trình đếm số ký tự chữ cái 
của tập tin và xuất kết quả ra một tập tin khác. 
Bài 20: Viết chương trình đếm số từ của tập tin 
và xuất kết quả ra một tập tin khác. 
Bài 21: Viết chương trình đếm số lần lặp lại của 
một từ trong một tập tin. 
Tập tin 
VC 
& 
BB 
48 
Bài tập thực hành 
Bài 22: Viết chương trình mở tập tin văn bản đã 
có trên đĩa, sao chép nó thành một tập tin văn 
bản mới với điều kiện là các chữ thường đổi 
thành chữ hoa, tất cả các ký tự khác không đổi. 
Bài 23: Viết chương trình ghép 2 tập tin văn 
bản, nội dung tập tin thứ hai được ghép sau tập 
tin thứ nhất. 
Bài 24: Viết sao sao chép một tập tin cho trước. 
Bài 25: Viết chương trình ghi một danh sách cấu 
trúc xuống tập tin sau đó đọc lên kiểm tra lại. 
Tập tin 

File đính kèm:

  • pdfnhap_mon_lap_trinh_bai_13_tap_tin_dang_binh_phuong.pdf