Bài giảng Kỹ thuật lập trình - Chương 9: Tập tin - Trần Quang

Các loại tập tin  Tập tin văn bản (text)  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)  Đượ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  Các tập tin này phải dùng chương trình dành riêng nào đó mới đọc và diễn dịch được. Ví dụ file .doc của MS Word, file ảnh .jpg, file thực thi .exe,

pdf33 trang | Chia sẻ: thanhle95 | Lượt xem: 503 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình - Chương 9: Tập tin - Trần Quang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trần Quang © 2016 Kỹ thuật lập trình 1 Chương 09: File Chương 09 TẬP TIN CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 2 Chương 09: File Tập tin (file)  Tất cả các biến dữ liệu của chương trình được lưu trong bộ nhớ RAM của máy tính. Khi chương trình kết thúc, tất cả các biến này sẽ bị xóa đi.  Để giữ các dữ liệu này lại khi chương trình kết thúc, ta 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. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 3 Chương 09: File Mô hình tập tin  Tập tin là một dãy các bytes dữ liệu kết thúc bằng ký tự đặc biệt EOF  EOF (End Of File): là giá trị đặc biệt, không trùng với bất cứ giá trị của byte dữ liệu nào.  EOF: khi dùng các hàm đọc dữ liệu trả về EOF là biết kết thúc tập tin.  (Nhiều hệ thống EOF = -1) 1 2 3 N N bytes dữ liệu của một file EOF CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 4 Chương 09: File Các loại tập tin  Tập tin văn bản (text)  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)  Đượ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  Các tập tin này phải dùng chương trình dành riêng nào đó mới đọc và diễn dịch được. Ví dụ file .doc của MS Word, file ảnh .jpg, file thực thi .exe, CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 5 Chương 09: File Quy trình xử lý tập tin 1. Khai báo con trỏ tập tin 2. Mở tập tin  Dùng hàm: fopen 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, con trỏ đánh dấu trong tập tin tự động tăng đến phần tử tiếp theo 4. Đóng tập tin  Dùng hàm fclose CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 6 Chương 09: File Con trỏ đánh dấu trong tập tin 1 2 3 N N bytes dữ liệu của một file EOF Sau khi mở tập tin thành công, con trỏ đánh dấu tự động chỉ đến byte đầu tiên của tập tin 1 2 3 N EOF Sau khi đọc 1 byte dữ liệu, ví dụ sử dụng hàm fgetc() CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 7 Chương 09: File Con trỏ đánh dấu trong tập tin 1 2 3 N EOF Sau khi đã đọc xong N bytes, con trỏ đánh dấu chỉ đến EOF Lần đọc dữ liệu kế tiếp hàm đọc sẽ trả về giá trị EOF cho biết đã kết thúc tập tin CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 8 Chương 09: File Khai báo con trỏ tập tin (FILE *)  Biến (con trỏ) trong chương trình dùng để gắn kết với tập tin trên đĩa được định nghĩa với kiểu đặc biệt theo cú pháp sau: FILE * Ví dụ: FILE *fp;  Kiểu FILE là kiểu cấu trúc do C định nghĩa sẵn trong CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 9 Chương 09: File Mở tập tin fopen (, );  Ví dụ: FILE *fp; fp = fopen("c:\\test.txt", "r");  filename là tên tập tin trên đĩa, chú ý dùng \\ trong đường dẫn CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 10 Chương 09: File Chế độ mở tập tin 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 cuối tập tin nếu đã 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 cuối tập tin đó. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 11 Chương 09: File Kiểm tra việc mở tập tin FILE *fp; fp = fopen ("E:\\tmp\\vidu.txt", "r"); if (fp == NULL) printf("Khong mo duoc file\n"); else { // xử lý file } if (fp == NULL) { printf("Khong mo duoc file\n"); return; } // xử lý file CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 12 Chương 09: File Đóng tập tin  Cú pháp: int fclose (FILE *fp); Ví dụ: fclose(fp); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 13 Chương 09: File Đọc 1 ký tự từ tập tin  Cú pháp: int fgetc (FILE *fp);  Ví dụ: char c; FILE *fp; fp = fopen ("E:\\tmp\\vidu.txt", "r"); c = fgetc (fp); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 14 Chương 09: File Hàm kiểm tra cuối tập tin  Cú pháp: int feof (FILE *fp) Hàm trả về giá trị khác 0 nếu gặp cuối file khi đọc, trái lại hàm cho giá trị 0.  Ví dụ: char c; FILE *fp; fp = fopen("E:\\tmp\\vidu.txt", "r"); while ( !feof(fp) ) { c = fgetc(fp); printf("%c", c); } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 15 Chương 09: File Đọc tất cả các ký tự trong tập tin vào bộ đệm Giả sử buffer đủ lớn để chứa toàn bộ dữ liệu từ tập tin void readFile(FILE* fp, char* buffer){ int i = 0; int ch = fgetc(fp); while(ch != EOF){ buffer[i] = ch; ch = fgetc(fp); i += 1; } buffer[i] = '\0'; } CH = Đọc một ký tự CH EOF Đưa CH vào bộ đệm CH = Đọc một ký tự false true CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 16 Chương 09: File Ghi 1 ký tự vào tập tin  Cú pháp: int fputc (char c, FILE *fp); Ví dụ: FILE *fp; fp = fopen ("E:\\tmp\\vidu2.txt", "w"); fputc ('A', fp); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 17 Chương 09: File Hàm fgets() – fputs()  Cú pháp: char *fgets(char *str, int n, FILE *fp);  Dùng để đọc 1 chuỗi từ file vào biến str, n là số ký tự tối đa sẽ đọc  Hàm trả về con trỏ tới string đọc được nếu thành công  Hàm trả về NULL nếu xảy ra lỗi hoặc gặp cuối file.  Cú pháp: int fputs(const char *str, FILE *fp);  Dùng để ghi 1 chuỗi vào file  Hàm trả về giá trị không âm nếu ghi thành công CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 18 Chương 09: File fgets() – fputs() Ví dụ: char s[255]; FILE *fp; printf ("Nhap vao 1 cau: "); fgets (s, 255, stdin); fp = fopen ("E:\\tmp\\vidu.txt","w+"); fputs (s, fp); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 19 Chương 09: File fgets() – fputs() Ví dụ: char s[100]; FILE *fp; fp = fopen ("E:\\tmp\\vidu.txt","w+"); if (fp==NULL) return 0; fputs ("Tran van Hung\n", fp); fputs ("Le Thi Thu Thao\n", fp); rewind(fp); fgets (s,100, fp); printf ("%s", s); // Tran Van Hung CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 20 Chương 09: File Hàm fscanf( )  Hàm thư viện đọc dữ liệu từ tập tin theo định dạng: fscanf ( , , );  Việc sử dụng hàm fscanf() tương tự như hàm scanf(), chỉ có khác ở chỗ những gì lẽ ra nhập từ bàn phím sẽ được đọc vào từ tập tin.  Ví dụ: fscanf (fp, "%d", &n); fscanf (fp, "%f", &(sv1->diem_btl); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 21 Chương 09: File Hàm fprintf ( )  Hàm thư viện ghi tập tin theo định dạng: int fprintf (, , );  Việc sử dụng hàm fprintf() tương tự như hàm printf(), chỉ có khác ở chỗ những gì in ra màn hình sẽ được ghi lên tập tin.  Ví dụ: fprintf (fp, "%d%s%.0g\n", 10, "!= " , gt(10)); fprintf (fp, "%s%d\n", "S= ", x*2+3); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 22 Chương 09: File Di chuyển con trỏ đến 1 vị trí mới  Cú pháp: int fseek (FILE *fp, long sb, int xp); Trong đó  sb là số byte cần di 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:  SEEK_SET hay 0 : Xuất phát từ đầu file.  SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại của con trỏ chỉ vị trí.  SEEK_END hay 2 : Xuất phát từ cuối file. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 23 Chương 09: File Di chuyển con trỏ đến 1 vị trí mới  Ví dụ: fseek(fp, 1, SEEK_SET); a = fgetc(fp); printf("%c ", a); fseek(fp, 3, SEEK_CUR); a = fgetc(fp); printf("%c ", a); fseek(fp, -1, SEEK_END); a = fgetc(fp); printf("%c ", a); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 24 Chương 09: File Di chuyển con trỏ về đầu tập tin  Cú pháp: int rewind (FILE *fp);  Ví dụ: while (!feof(fp)) { a = getc(fp); printf("%c", a); } printf("\n"); rewind(fp); while (!feof(fp)) { a = getc(fp); printf("%c", a); } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 25 Chương 09: File Xác định vị trí hiện tại của con trỏ  Cú pháp: int ftell (FILE *fp);  Ví dụ: printf ("%d ", ftell (fp)); fseek (fp, -1, SEEK_END); a = fgetc (fp); printf ("%c ", a); printf ("%d ", ftell(fp)); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 26 Chương 09: File Random - Access File CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 27 Chương 09: File Random - Access File  Là loại file được mở và cho truy cập ngẫu nhiên  Bao gồm một loạt các mẩu tin có cùng kích thước (fixed-length records). Kích thước mẩu tin phụ thuộc vào các thành phần (trường-field) bên trong mẩu tin CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 28 Chương 09: File struct  struct là kiểu dữ liệu có thể bao gồm các thành phần bên trong, mỗi thành phần có thể thuộc kiểu dữ liệu cơ bản khác như: int, char, float,  Khai báo: struct structure_name { data_type member1; data_type member2; data_type membern; }; CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 29 Chương 09: File struct  Khai báo biến struct struct person { char name[50]; int cit_no; float salary; }; struct person p1, p2, p[20];  Gán giá trị khởi tạo cho biến struct: struct person p3 = {"Le Minh", 10, 2000};  Truy cập vào từng thành phần dùng toán tử . (chấm) printf ("%s\n", p3.name); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 30 Chương 09: File Hàm fread()  Cú pháp: size_t fread( void *buffer, size_t size, size_t count, FILE *fp);  Tham số:  buffer: con trỏ trỏ tới data cần ghi xuống file.  size: kích thước data ghi xuống file (tính theo byte)  count: số lượng data được ghi xuống file.  fp: con trỏ file  Ghi chú:  Hàm fread( ) đọc dữ liệu từ file, khác với hàm fscanf( ) ở chỗ có thể đọc cả struct, object,(đọc cả khối dữ liệu chỉ cần biết kích thước và cấu trúc).  Trả về số lượng data đọc được nếu thành công.  Nếu xảy ra lỗi hoặc gặp cuối file, hàm sẽ trả về số nguyên nhỏ hơn số lượng data được ghi. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 31 Chương 09: File Hàm fwrite()  Cú pháp size_t fwrite( const void *buffer, size_t size, size_t count, FILE *fp);  Tham số:  buffer: con trỏ trỏ tới data cần ghi xuống file.  size: kích thước data cần ghi xuống file (tính theo byte)  count: số lượng data được ghi xuống file.  Ghi chú:  Hàm fwrite() ghi data xuống file, khác với hàm fprintf( ) ở chỗ hàm fwrite( ) có thể ghi cả struct, object,.. xuống file theo kiểu binary. Hàm fprintf( ) chỉ có thể ghi dạng text  Trả về số lượng data được ghi xuống, nếu ghi thành công  Nếu xảy ra lỗi, hàm sẽ trả về số nguyên nhỏ hơn số lượng data được ghi. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 32 Chương 09: File Ví dụ về hàm fread() và fwrite() struct Date { int d, m, y; }; FILE *fp; struct Date ns1 = {30, 4, 2015}, ns2; fp = fopen ("E:\\tmp\\data.dat","w+"); if (fwrite(&ns1, sizeof(ns1), 1, fp) != 1) { printf ("Error writting"); return 0; } rewind(fp); if (fread (&ns2, sizeof(ns2), 1, fp) != 1) printf ("\nError reading "); else printf ("\nNgay sinh: %.2d/%.2d/%.4d", ns2.d, ns2.m, ns2.y); fclose(fp); CuuDuongThanCong.com https://fb.com/tailieudientucntt Trần Quang © 2016 Kỹ thuật lập trình 33 Chương 09: File Nhập và in danh sách sinh viên struct sinhvien { char ten[30]; float dtb; }; FILE *fp; int n; struct sinhvien sv; fp = fopen ("E:\\tmp\\data.dat","w+"); for (int i=1; i<4; i++){ fflush (stdin); printf ("\nNhap sv%d:\n", i); printf (" Ten: "); gets(sv.ten); printf (" dtb: "); scanf("%f", &sv.dtb); fwrite (&sv, sizeof(struct sinhvien), 1, fp); } rewind(fp); while ( fread(&sv, sizeof(struct sinhvien),1,fp) != 0 ) printf("\n%s\t%.2f", sv.ten, sv.dtb); CuuDuongThanCong.com https://fb.com/tailieudientucntt