Bài giảng Kỹ thuật lập trình - Chương 09: Tập tin - Nguyễn Thanh Tùng
nTại sao phải dùng tập tin (file)?
nMô hình tập tin
nCác loại tập tin
nCác thao tác bắt buộc
nĐọc và ghi dữ liệu vào tập tin
nTập tin văn bản
nĐọc, ghi, đọc và ghi
nTập tin nhị phân
nĐọc, ghi, đọc và ghi
nCác hàm xử lý tập tin
nCác ví dụ
nTổng kết
n
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 09: Tập tin - Nguyễn Thanh Tùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_ky_thuat_lap_trinh_chuong_09_tap_tin_nguyen_thanh.pptx
Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 09: Tập tin - Nguyễn Thanh Tùng
- Nội dung ◼ 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 ◼ Đọc, ghi, đọc và ghi ◼ Tập tin nhị phâ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 Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 2 © 2016
- Mô hình tập tin ◼ 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 ◼ 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) EOF 1 2 3 N N bytes dữ liệu của một file ở mức mô hình Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 4 © 2016
- Các thao tác bắt buộc ◼ (1) Khai báo sử dụng kiểu dữ liệu tập tin ◼ (2) Mở tập tin ◼ Hàm: fopen, nói sau ◼ (3) Thao tác với tập tin ◼ Đọ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 ◼ Hàm: fclose, nói sau Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 6 © 2016
- 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 Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 8 © 2016
- 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 Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 10 © 2016
- Tập tin văn bản: Đọc tập tin Ý tưởng CH = Đọc một ký tự false CH <> EOF true Đưa CH vào bộ đệm CH = Đọc một ký tự Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 12 © 2016
- 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 Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 14 © 2016
- 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 Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 16 © 2016
- 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] = '\0'; } fgetc: hàm đọc từng ký tự Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 18 © 2016
- 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 ◼ Hàm fgetc: ◼ Nhận vào con trỏ đến tập tin ◼ Trả về một giá trị kiểu int ◼ Nếu giá trị trả về từ hàm fgetc là EOF thì chỉ ra là kết thúc tập tin ◼ Ngược lại: ◼ fgetc trả về một ký tự có thể ép kiểu vào unsigned char (0, , 255) ◼ fgetc đặt thẻ đánh dấu tại byte kế tiếp trên tập tin, để lần sau đó gọi fgetc sẽ đọc ký tự kế tiếp Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 20 © 2016
- Tập tin văn bản : Đọc tập tin Chương trình hoàn chỉnh #include #include #define MAX_LEN 1024 int main(){ //Mo tap 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); } //Doc tap tin char buffer[MAX_LEN]; Hàm đọc ở doc_tap_tin(file_ptr, buffer); slide trước //Dong tap tin fclose(file_ptr); printf("%s", buffer); system("pause"); Trường Đại HọcreturnBách Khoa EXIT_SUCCESS; Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 22 © 2016}
- Tập tin văn bản: Ghi tập tin Các bước tương tự như đọc tập tin Bước Đọc tâp tin Ghi tập tin (1) Khai báo FILE *file_ptr FILE *file_ptr con trỏ tập tin (2) Mở tập tin file_ptr = file_ptr = fopen("test.txt", fopen("test.txt", "r"); "w"); (4) Đóng tập fclose(file_ptr) fclose(file_ptr) tin Chỉ có bước số (3) Dành cho việc đọc và ghi là thực sự khác nhau nhiều Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 24 © 2016
- Tập tin văn bản: Ghi tập tin Bài toán ◼ Phân tích bài toán: ◼ Cần định nghĩa kiểu dữ liệu Student gồm các trường thông tin như sau typedef struct{ char name[20]; float math, physics, english; } Student; Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 26 © 2016
- Tập tin văn bản: Ghi tập tin Bài toán ◼ Phân tích bài toán: ◼ Ý tưởng chính của việc ghi là: duyệt qua từng phần tử trong mảng và ghi từng phần tử vào tập tin for(int i=0; i< 3; i++){ fprintf(file_ptr, "%-15s:%-5.1f,%5.1f,%5.1f\n", list[i].name, list[i].math, list[i].physics, list[i].english); } file_ptr: là con trỏ đến FILE, và đã mở tập tin cho ghi trước đó. Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 28 © 2016
- Tập tin văn bản: Ghi tập tin Bài toán – chương trình hoàn chỉnh FILE* file_ptr = NULL; file_ptr = fopen("data.txt", "a"); if(file_ptr == NULL){ perror("Co loi: "); system("pause"); exit(EXIT_FAILURE); } for(int i=0; i< 3; i++){ fprintf(file_ptr, "%-15s:%-5.1f,%5.1f,%5.1f\n", list[i].name, list[i].math, list[i].physics, list[i].english); } fclose(file_ptr); system("pause"); return EXIT_SUCCESS; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 30 © 2016
- Tập tin văn bản có định dạng: đọc tập tin Các thao tác int main(){ Student list[100]; int size = 0; FILE* file_ptr = NULL; 1. Khai báo con trỏ tập tin mo_tap_tin(&file_ptr, "data.txt"); 2. Mở tập tin cho đọc size = doc_du_lieu(file_ptr, list); 3. Đọc dữ liệu có định dạng dong_tap_tin(file_ptr); 4. Đóng tập tin in_du_lieu(list, size); 5. In dữ liệu system("pause"); return EXIT_SUCCESS; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 32 © 2016
- Tập tin văn bản có định dạng: đọc tập tin Các thao tác Mở tập tin cho đọc void mo_tap_tin(FILE file_ptr, char tap_tin[]){ *file_ptr = fopen(tap_tin, "r"); if(*file_ptr == NULL){ perror("Co loi: "); system("pause"); exit(EXIT_FAILURE); } } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 34 © 2016
- Tập tin văn bản có định dạng: đọc tập tin Các thao tác int doc_du_lieu(FILE* file_ptr, Student list[]){ int size =0; bool doc_tiep = true; while(doc_tiep){ doc_tiep = doc_ten(file_ptr, list[size].name, ':'); if(!doc_tiep) break; doc_tiep = doc_diem(file_ptr, &list[size].math, &list[size].physics, &list[size].english); if(!doc_tiep) break; doc_tiep = xoa_xuong_hang(file_ptr); size += 1; if(!doc_tiep) break; }//while return size; Các bước đọc dữ liệu } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 36 © 2016
- Tập tin văn bản có định dạng: đọc tập tin Các thao tác bool doc_diem(FILE* file_ptr, float *math, float *physics, float *english){ int num = fscanf(file_ptr, "%f , %f, %f", math, physics, english); if(num != 3) return false; else return true; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 38 © 2016
- Tập tin văn bản có định dạng: đọc tập tin Các thao tác void in_du_lieu(Student list[], int size){ for(int i=0; i< size; i++){ printf("%-20s:%-5.1f,%5.1f,%5.1f\n", list[i].name, list[i].math, list[i].physics, list[i].english); } } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 40 © 2016
- Đọc và ghi với tập tin ◼ Ghi dữ liệu ◼ Việc ghi thường dễ dàng hơn đọc. ◼ Với tập tin nhị phân, dùng hàm fwrite. ◼ Hàm này cho phép đặc tả số lượng và kích thước mỗi phần tử (các phần tử có thể là struct hay array) Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 42 © 2016
- Tập tin nhị phân: Ghi tập tin Các thao tác int main(){ Student list[MAX_SIZE]; int size; size = sinh_du_lieu_mau(list); ghi_du_lieu(list, size, "stu_list.data"); in_du_lieu(list, size); printf("\n\n"); system("pause"); return EXIT_SUCCESS; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 44 © 2016
- Tập tin nhị phân : Ghi tập tin Các thao tác int sinh_du_lieu_mau(Student *list){ time_t t; srand((unsigned int) time(&t)); for(char c='A'; c <= 'Z'; c++){ list[c - 'A'].name[0] = c; list[c - 'A'].name[1] = '\0'; list[c - 'A'].math = ((float)rand()/RAND_MAX)*10; list[c - 'A'].physics = ((float)rand()/RAND_MAX)*10; list[c - 'A'].english = ((float)rand()/RAND_MAX)*10; } return ('Z' - 'A' + 1); } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 46 © 2016
- Tập tin nhị phân : Ghi tập tin Các thao tác void in_du_lieu(Student *list, int size){ for(int i=0; i< size; i++){ printf("%-20s:%-5.1f,%-5.1f,%-5.1f\n", list[i].name, list[i].math, list[i].physics, list[i].english); } } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 48 © 2016
- Tập tin nhị phân : Đọc tập tin Các thao tác Đọc từng hồ sơ int c= 0; int num = 0; while(true){ num = fread(&list[c], sizeof(Student), 1, file_ptr); if(num != 1){ break; } c++; } *size = c; Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 50 © 2016
- Tập tin nhị phân : Đọc tập tin voidCácdoc_du_lieu(Student thao tác *list, int *size, char* file){ FILE* file_ptr = NULL; file_ptr = fopen(file, "rb"); if(file_ptr == NULL){ perror("Error in open file: "); system("pause"); exit(EXIT_FAILURE); } int c= 0; int num = 0; while(true){ num = fread(&list[c], sizeof(Student), 1, file_ptr); if(num != 1){ break; } c++; } *size = c; fclose(file_ptr); Trường Đại Học Bách Khoa Lập trình C/C++ Trung} Tâm Kỹ Thuật Điện Toán 52 © 2016