Xem mẫu

  1. BÀI GIẢNG HỌC PHẦN KỸ THUẬT LẬP TRÌNH CHƯƠNG 7: TỆP
  2. Nội dung 7.1. Khái niệm tệp 7.2. Tệp văn bản 7.3. Tệp nhị phân 2
  3. 7.1. Khái niệm tệp • Tệp: là một tập hợp các dữ liệu cùng kiểu, có liên quan với nhau, được nhóm lại với nhau thành một dãy và thường được lưu trữ trên các thiết bị nhớ ngoài dưới một tên gọi nào đó. Tệp tồn tại ngay cả khi chương trình đã kết thúc hoặc tắt máy, thường được lưu trữ để sử dụng lâu dài • Khi khai báo biến tệp không cần xác định số phần tử của tệp • Khi lưu trữ, các phần tử của tệp được sắp xếp thành một dãy các byte liên tiếp nhau, sau phần tử dữ liệu cuối cùng là phần tử EOF (mã kết thúc tệp) • 2 loại tệp: tệp văn bản, tệp nhị phân 3
  4. 7.2. Tệp văn bản • Khai báo tệp văn bản • Mở tệp văn bản • Đóng tệp văn bản • Đọc/ghi một ký tự với tệp văn bản • Đọc/ghi theo kiểu văn bản • Đọc/ghi một xâu ký tự 4
  5. Khai báo tệp văn bản • Tệp văn bản: - Lưu trữ dữ liệu dưới dạng ký tự - Có 2 cách truy xuất theo kiểu ký tự: + Truy xuất theo từng ký tự + Truy xuất theo từng dòng • Cú pháp khai báo biến tệp: FILE *con_trỏ_tệp; Ví dụ: FILE *fp; 5
  6. Mở tệp văn bản (1) • Cú pháp: con_trỏ_tệp = fopen("tên_tệp", "kiểu_truy_nhập"); - Hàm fopen nếu mở tệp thành công sẽ trả về con trỏ tệp cho tệp được mở, nếu tệp cần mở không tồn tại trên ổ đĩa thì hàm fopen trả về giá trị NULL - "tên_tệp" có thể bao gồm cả đường dẫn đầy đủ tới tệp Ví dụ: "C:\SV\tepvanban.txt" 6
  7. Mở tệp văn bản (2) • Cú pháp: (tiếp) - "kiểu_truy_nhập" có thể nhận các giá trị sau: "r" mở tệp để đọc, nếu tệp chưa tồn tại thì báo lỗi "w" mở tệp mới để ghi, nếu tệp đã tồn tại sẽ bị xóa "a" mở tệp để ghi bổ sung vào cuối tệp, nếu tệp chưa tồn tại thì tạo tệp mới "r+" mở tệp để cập nhật (đọc/ghi), nếu tệp chưa tồn tại thì báo lỗi "w+" mở tệp mới để đọc/ghi, nếu tệp đã tồn tại sẽ bị xóa "a+" mở tệp để đọc/ghi bổ sung vào cuối tệp, nếu tệp chưa tồn tại thì tạo tệp mới - Ví dụ: fp = fopen("C:\SV\tepvanban.txt", "w"); 7
  8. Đóng tệp văn bản • Cú pháp: fclose(con_trỏ_tệp); - Các thao tác thực hiện: + Đẩy dữ liệu còn trong vùng đệm lên đĩa (khi đang ghi) + Xóa vùng đệm (khi đang đọc) + Giải phóng biến con trỏ để nó có thể dùng cho tệp khác. Nếu thành công hàm cho giá trị 0, trái lại hàm cho EOF • Ví dụ: fclose(fp); 8
  9. Đọc/ghi một ký tự với tệp văn bản (1) • Ghi ký tự vào tệp: Có thể sử dụng 1 trong 2 hàm: putc(ch, fp); fputc(ch, fp); trong đó: ch là một giá trị nguyên (coi là không dấu), fp là con trỏ tệp Hàm ghi lên tệp ký tự có mã bằng m = ch % 256 Nếu thành công hàm cho mã ký tự được ghi, nếu không hàm cho EOF Nếu m=10, hàm sẽ ghi lên tệp 2 mã 13 và 10 9
  10. Đọc/ghi một ký tự với tệp văn bản (2) • Đọc ký tự từ tệp: Có thể sử dụng 1 trong 2 hàm: getc(fp); fgetc(fp); trong đó: fp là con trỏ tệp Hàm đọc một ký tự từ tệp Nếu thành công hàm cho mã ký tự đọc được ( [0,255], nếu gặp cuối tệp hoặc có lỗi thì hàm cho EOF Hàm đọc một lượt cả 2 mã 13 và 10 rồi trả về giá trị 10 Khi gặp mã 26 thì hàm trả về EOF 10
  11. Đọc/ghi theo kiểu văn bản (1) • Ghi dữ liệu theo định dạng: fprintf(fp,xâu_định_dạng, danh_sách_tham_số); trong đó: fp là con trỏ tệp Giá trị các tham số được ghi lên tệp theo định dạng trong xâu_định_dạng Nếu thành công hàm trả về giá trị nguyên bằng số byte dữ liệu được ghi lên tệp, khi có lỗi thì hàm cho EOF 11
  12. Đọc/ghi theo kiểu văn bản (2) • Đọc dữ liệu theo định dạng: fscanf(fp,xâu_định_dạng, danh_sách_tham_số); trong đó: fp là con trỏ tệp Đọc dữ liệu từ tệp, biến đổi theo định dạng và lưu kết quả vào các tham số Hàm trả về giá trị bằng số trường được đọc 12
  13. Đọc/ghi một xâu ký tự (1) • Ghi một xâu ký tự vào tệp: fputs(s,fp); trong đó: - s là con trỏ trỏ tới địa chỉ đầu của một xâu ký tự kết thúc bằng ký tự '\0' - fp là con trỏ tệp Ghi xâu s lên tệp fp (không ghi ký tự '\0' vào tệp) Nếu thành công hàm trả về ký tự cuối cùng được ghi vào tệp, khi có lỗi thì hàm cho EOF 13
  14. Đọc/ghi một xâu ký tự (2) • Đọc một xâu ký tự từ tệp: fgets(s,n,fp); trong đó: - s là con trỏ (kiểu char) trỏ tới một vùng nhớ đủ lớn để lưu xâu ký tự đọc được từ tệp - n là số nguyên xác định độ dài cực đại của xâu cần đọc - fp là con trỏ tệp Đọc một xâu ký tự từ tệp fp lưu vào vùng nhớ s 14
  15. Đọc/ghi một xâu ký tự (3) • Đọc một xâu ký tự từ tệp: (tiếp) Quá trình đọc kết thúc khi: + Hoặc đã đọc n-1 ký tự + Hoặc gặp dấu xuống dòng (cặp mã 13 10), khi đó mã 10 được đưa vào xâu kết quả + Hoặc kết thúc tệp Xâu kết quả được bổ sung thêm ký tự '\0' Khi đọc thành công, hàm trả về địa chỉ vùng nhận kết quả, nếu có lỗi hoặc đọc hết tệp thì hàm trả về giá trị NULL 15
  16. Ví dụ (1) • Chương trình đọc/ghi từng dòng văn bản: #include int main(void) { FILE *fp; int i; char s[256]; fp = fopen("vanban.txt","w"); 16
  17. Ví dụ (2) i=0; while(1) { i++; printf("Nhap dong thu %d (nhan Enter de ket thuc):",i); fflush(stdin); gets(s); if (s[0]=='\0') break; if (i>1) fputc(10,fp); fputs(s,fp); } fclose(fp); 17
  18. Ví dụ (3) printf("Van ban da nhap la:\n"); fp = fopen("vanban.txt","r"); while (!feof(fp)) { fgets(s,256,fp); printf("%s",s); } fclose(fp); return 0; } 18
  19. 7.3. Tệp nhị phân • Khai báo tệp nhị phân • Mở tệp nhị phân • Đóng tệp nhị phân • Đọc/ghi một ký tự với tệp nhị phân • Đọc/ghi một số nguyên • Đọc/ghi một mẫu tin • Truy cập ngẫu nhiên 19
  20. Khai báo tệp nhị phân • Tệp nhị phân: - Dùng để lưu trữ dữ liệu theo dạng “nhị phân” • Cú pháp khai báo biến tệp: tương tự như tệp văn bản FILE *con_trỏ_tệp; Ví dụ: FILE *fp; 20
nguon tai.lieu . vn