Chng 09 TP TIN Nguyn Thanh Tng Trng
- Slides: 52
Chương 09 TẬP TIN Nguyễn Thanh Tùng Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++
Nội dung n n n Tại sao phải dùng tập tin (file)? Mô hình tập tin Các loại tập tin Các thao tác bắt buộc Đọc và ghi dữ liệu vào tập tin Tập tin văn bản n n Tập tin nhị phân n n Đọc, ghi, đọc và ghi Các hàm xử lý tập tin Các ví dụ Tổng kết Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 2
Tại sao phải dùng tập tin (file)? n Khi một chương trình kết thúc thực thi, các biến dữ liệu liên quan sẽ bị dọn dẹp khỏi bộ nhớ chính (RAM) của máy tính n => Để dữ liệu không bị chương trình mất đi khi chương trình kết thúc, chương trình cần lưu chúng dưới dạng tập tin (file) vào các thiết bị lưu trữ như ổ cứng, CD, DVD, v. v. Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 3
Mô hình tập tin n Tập tin là một dãy các bytes dữ liệu, như hình vẽ, kết thúc bằng ký hiệu đặc biệt EOF n n n EOF (End Of File): là giá trị đặt biệt, không trùng với bất cứ giá trị của byte dữ liệu nào. EOF: Ký hiệu mà các hàm đọc dữ liệu trả về để cho biết kết thúc tập tin. (Nhiều hệ thống EOF = -1) … 1 2 3 EOF N N bytes dữ liệu của một file ở mức mô hình Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 4
Các loại tập tin n Tập tin văn bản (text) n n n Các byte trong mô hình tập tin chứa các ký tự đọc được (có nghĩa) bởi con người Tập tin có thể mở ra để đọc và thay đổi bởi chương trình soạn thảo văn bản như NOTEPAD. Tập tin nhị phân (binary) n n Được tạo bởi chương trình nào đó, không dành cho con người đọc và hiểu trực tiếp bằng NOTEPAD Tập tin dành riêng cho chương trình nào đó đọc và diễn dịch theo ý của chương trình đó. Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 5
Các thao tác bắt buộc n n (1) Khai báo sử dụng kiểu dữ liệu tập tin (2) Mở tập tin n n (3) Thao tác với tập tin n Hàm: fopen, nói sau Đọc hay ghi dữ liệu Mỗi lần đọc hay ghi dữ liệu, thẻ đánh dấu trong tập tin tự động tăng đến phần tử tiếp theo (4) Đóng tập tin n Hàm: fclose, nói sau Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 6
Các thao tác bắt buộc Thẻ đánh dấu trong tập tin N bytes dữ liệu của một file ở mức mô hình 1 2 3 … N EOF Sau khi mở tập tin thành công, thẻ đánh dấu tự động chì đến byte đầu tiên của tập tin Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 7
Các thao tác bắt buộc Thẻ đánh dấu trong tập tin N bytes dữ liệu của một file ở mức mô hình 1 2 3 … N EOF Sau khi đọc 1 byte dữ liệu, ví dụ sử dụng hàm fgetc Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 8
Các thao tác bắt buộc Thẻ đánh dấu trong tập tin N bytes dữ liệu của một file ở mức mô hình 1 2 3 … N EOF Sau khi đọc 1 byte dữ liệu nữa Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 9
Các thao tác bắt buộc Thẻ đánh dấu trong tập tin N bytes dữ liệu của một file ở mức mô hình 1 2 3 … N EOF Sau khi đã đọc thành công N bytes Thẻ đánh dấu chỉ đến EOF Lần đọc dữ liệu kế tiếp hàm đọc trả về giá trị EOF để nói rằng kết thúc tập tin, và giá trị trả về là EOF (-1) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 10
Tập tin văn bản: Đọc tập tin Yêu cầu Vào: tập tin văn bản (đọc được) Chương trình: đọc các dòng văn bản và đưa vào bộ đệm Ra: in lại các dòng trên màn hình Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 11
Tập tin văn bản: Đọc tập tin Ý tưởng CH = Đọc một ký tự CH <> EOF false true Đưa CH vào bộ đệm CH = Đọc một ký tự Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 12
Tập tin văn bản: Đọc tập tin (1) Khai báo con trỏ tập tin FILE* file_ptr = NULL; Con trỏ đến tập tin, một danh hiệu Kiểu dữ liệu FILE Định nghĩa trong <stdio. h> Đặt #include <stdio. h> đầu tập tin Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 13
Tập tin văn bản: Đọc tập tin (2) Mở tập tin FILE* file_ptr = NULL; file_ptr = fopen("test. txt", "r"); if(file_ptr == NULL){ perror("Loi da xay ra: "); system("pause"); exit(EXIT_FAILURE); } • Mở tập tin bằng hàm fopen • Tên tập tin: "test. txt” • Mục tiêu của việc mở là: ”r” cho việc đọc (read) • Kiểm tra xem file_ptr có NULL không • = NULL nghĩa là không mở được tập tin • = NULL, có thể chấm dứt thực thi Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 14
Tập tin văn bản: Đọc tập tin (2) Mở tập tin FILE* file_ptr = NULL; file_ptr = fopen("test. txt", "r"); if(file_ptr == NULL){ perror("Loi da xay ra: "); system("pause"); exit(EXIT_FAILURE); } "test. txt”: Chương trình tìm tập tin này ở thư mục hiện tại (chứa tập tin thực thi), hoặc trong các thư mục chứa trong biến môi trường PATH Nếu chỉ ra đường dẫn, dùng HAI DẤU “\” thay cho chỉ 01 dấu; vì “” là ký tự điều khiển trong chuỗi Ví dụ: Dùng C: \DATA\Test. txt thay cho: C: DATATest. txt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 15
Tập tin văn bản : Đọc tập tin (2) Mở tập tin – chế độ mở Chế độ Mô tả r Mở tập tin để đọc. w Mở tập tin để ghi. Nếu tập tin đã tồn tại, xóa toàn bộ nội dung tập tin đó. a Nối tập tin. Mở tập tin đã có sẵn hoặc tạo mới tập tin, ghi vào đuôi của tập tin nếu nó tồn tại. r+ Mở tập tin cho phép đọc lẫn ghi. Không tạo mới tập tin nếu tập tin chưa có sẵn. w+ Mở tập tin cho phép đọc lẫn ghi. Tạo mới tập tin nếu tập tin chưa có sẵn. a+ Nối tập tin, cho phép đọc tập tin. Mở tập tin đã có sẵn hoặc tạo mới tập tin, ghi vào đuôi của tập tin đó. Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 16
Tập tin văn bản : Đọc tập tin (3) Đọc tất cả các ký tự trong tập tin vào một bộ đệm void doc_tap_tin(FILE* file_ptr, char* buffer){ int index = 0; int ch = fgetc(file_ptr); while(ch != EOF){ buffer[index] = ch; ch = fgetc(file_ptr); index += 1; } buffer[index] = '