Bài giảng Lập trình C - Chương 6: Thao tác trên tập tin - Trần Minh Thái

pptx 35 trang cucquyet12 9180
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C - Chương 6: Thao tác trên tập tin - Trần Minh Thái", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_lap_trinh_c_chuong_6_thao_tac_tren_tap_tin_tran_mi.pptx

Nội dung text: Bài giảng Lập trình C - Chương 6: Thao tác trên tập tin - Trần Minh Thái

  1. Lập trình C Chương 6. Thao tác trên tập tin (3 tiết) Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: 20/03/2017
  2. Nội dung • Khái niệm • Khai báo • Các thao tác trên tập tin • Bài tập 2
  3. KHÁI NIỆM
  4. Khái niệm • File cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa) • File có thể lưu dữ liệu kích thước lớn với số lượng các phần tử không hạn chế (chỉ bị hạn chế bởi dung lượng của bộ nhớ ngoài) 4
  5. Khái niệm • Biến File: là một biến thuộc kiểu dữ liệu tập tin dùng để đại diện cho một tập tin • Con trỏ tập tin: Xác định vị trí trong tập tin khi thao tác đọc /ghi • Phân loại File: • File text • File nhị phân 5
  6. File text • Dùng để ghi các ký tự lên đĩa dưới dạng mã Ascii • Dữ liệu của tập tin được lưu trữ thành các dòng, mỗi dòng được kết thúc bằng ký tự xuống dòng (new line), ký hiệu ‘\n’ • Mỗi tập tin được kết thúc bởi ký tự EOF (End Of File) có mã Ascii là 26 (xác định bởi tổ hợp phím Ctrl + Z) 6
  7. File nhị phân • Một dãy các bytes liên tục • Nội dung dữ liệu được mã hóa 7
  8. CÁC THAO TÁC TRÊN FILE
  9. Các thao tác khi thao tác trên File 1. Khai báo con trỏ file 2. Mở file 3. Thao tác đọc/ ghi trên file 4. Đóng file 9
  10. Khai báo con trỏ file • Cú pháp: FILE ; • Các biến trong danh sách phải là các con trỏ và được phân cách bởi dấu phẩy(,) • Ví dụ: FILE *f1, *f2; 10
  11. Mở file • Cú pháp: FILE *fopen(char *path, const char *mode) • Trong đó: • path: chuỗi chỉ đường dẫn đến tập tin trên đĩa • mode: chuỗi xác định cách thức mà tập tin sẽ mở • Hàm fopen trả về một con trỏ tập tin. Nếu có lỗi xuất hiện trong khi mở tập tin thì trả về con trỏ NULL 11
  12. Các thông tin Mode Mode Ý nghĩa r Mở tập tin văn bản để đọc w Tạo ra tập tin văn bản mới để ghi a Nối vào tập tin văn bản rb Mở tập tin nhị phân để đọc wb Tạo ra tập tin nhị phân để ghi ab Nối vào tập tin nhị phân r+ Mở một tập tin văn bản để đọc/ghi w+ Tạo ra tập tin văn bản để đọc ghi a+ Nối vào hay tạo mới tập tin văn bản để đọc/ghi r+b Mở ra tập tin nhị phân để đọc/ghi w+b Tạo ra tập tin nhị phân để đọc/ghi a+b Nối vào hay tạo mới tập tin nhị phân 12
  13. Ví dụ tạo mới file text “test.txt” ở ổ đĩa D: FILE *f; f = fopen(“D:\\test.txt”, “w”); if (f!=NULL) { /* Các câu lệnh để thao tác với tập tin*/ /* Đóng tập tin*/ } 13
  14. Đóng tập tin • Cú pháp: int fclose(FILE *f) • Trong đó f là con trỏ tập tin được mở bởi hàm fopen() • Trả về 0: đóng tập tin thành công • Trả về EOF nếu có xuất hiện lỗi • Đóng tất cả các tập tin lại: int fcloseall() 14
  15. Thao tác trên File text STT TÊN HÀM Ý NGHĨA SỬ DỤNG VÍ DỤ ĐỌC TẬP TIN fscanf(FILE *, định dạng, các 1 Đọc dữ liệu từ tập tin fscanf(f, “%d”, &x); tham biến) Đọc chuỗi ký tự từ tập tin fgets(chuỗi, kích thước tối đa, với kích thước tối đa cho char s[80]; 2 FILE *) phép, hoặc gặp ký tự fgets(s, 80, f); xuống dòng char c=getc(f); 3 getc(FILE *) Đọc ký tự từ tập tin GHI TẬP TIN fprintf(FILE *, định dạng, các 1 tham biến) Ghi dữ liệu vào tập tin fprintf(f, “%d”, x); fputs(chuỗi, FILE *) 2 Ghi chuỗi ký tự vào tập tin fputs(“Vi du”, f); 15
  16. Ví dụ Tạo tập tin văn bản “so.out” gồm n số nguyên, các số của dãy được tạo ngẫu nhiên có giá trị không vượt quá M (n, M đọc từ tập tin “so.inp”). Kết quả chương trình là 1 tập tin văn bản có dòng thứ nhất ghi số n; n dòng tiếp theo ghi các số tạo được, mỗi số trên một dòng File so.out 3 File so.inp 5 3 7 10 2 16
  17. # define in “SO.INP” # define out “SO.OUT” int main() { void DocFile(int &n, int &M) int n, M; { srand((unsigned int)time(NULL)); DocFile(n, M); FILE *fi; GhiFile(n, M); fi = fopen(in, "r"); return 0; } fscanf(fi, "%d%d", &n, &M); void GhiFile(int n, int M) fclose(fi); { } FILE *fo; fo = fopen(out, "w"); fprintf(fo, "%d\n", n); for (; n > 0; n ) fprintf(fo, "%d\n", rand()%(M - 1) + 1); fclose(fo); } 17
  18. Bài tập Viết các hàm sau: 1. Tạo mảng 1 chiều số nguyên a (giá trị ngẫu nhiên < 100) có kích thước n (0<n<10000). Lưu vào tập tin “mang.inp” theo định dạng: • Dòng đầu tiên lưu giá trị n • Dòng tiếp theo lưu các phần tử của mảng cách nhau bởi khoảng trắng 2. Đọc mảng 1 chiều từ file “mang.inp” và sắp xếp mảng theo thứ tự tăng dần. Lưu vào file “sapxep.out” theo cấu trúc tương tự câu 1. 18
  19. Bài tập Cho file “test.inp” có cấu trúc như sau • Dòng đầu tiên là số nguyên n • Dòng tiếp theo là n giá trị nguyên cách nhau bởi khoảng trắng Hãy viết các hàm tìm phần tử có giá trị lớn nhất, phần tử nhỏ nhất, số lượng phần tử chẵn, lẻ. Sau đó lưu vào file “kq.out” gồm các dòng sau: • Dòng 1: So lon nhat la: • Dòng 2: So nho nhat la: • Dòng 3: So phan tu chan la: • Dòng 4: So phan tu le la: 19
  20. Thao tác trên File nhị phân STT TÊN HÀM Ý NGHĨA SỬ DỤNG VÍ DỤ ĐỌC TẬP TIN • ptr: vùng nhớ để lưu dữ liệu đọc int a[30], b, n; • size: kích thước mỗi fread(a, 1 fread(&ptr, size, len, FILE *) ô nhớ (tính bằng sizeof(int), n , f); byte) Fread(&b, • len: độ dài dữ liệu sizeof(int), 1 , f); cần đọc GHI TẬP TIN Tham số tương tự như fwrite(a, 1 fwrite(&prt, size, len, FILE *) hàm fread sizeof(int), n , f); 20
  21. Các thao tác khác trên File Kiểm tra vị trí cuối cùng trong File • Cú pháp: int feof(FILE *f) • Trả về EOF nếu cuối tập tin • Ngược lại trả về 0 Di chuyển con trỏ về vị trí đầu File • Cú pháp: void rewind(FILE *f) 21
  22. ĐỌC, GHI KIỂU CẤU TRÚC TRÊN FILE
  23. Đọc kiểu cấu trúc trên file int fread (void *p, int size , int n, FILE *fp); • p: con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được • size: kích thước của mẫu tin (byte) • n: là số mẫu tin cần đọc • fp: là con trỏ file Hàm sẽ trả về một giá trị = số mẫu tin thực sự đọc được 23
  24. Ghi kiểu cấu trúc trên file int fwrite (void *p, int size , int n , FILE *fp); • p: con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi • size: kích thước của mẫu tin (byte) • n: số mẫu tin cần ghi • fp: con trỏ file Hàm sẽ trả về một giá trị = số mẫu tin thực sự ghi được 24
  25. Ví dụ Viết chương trình phát sinh ngẫu nhiên danh sách các tọa độ điểm trong mặt phẳng Oxy (Giá trị của mỗi trục tọa độ phát sinh trong khoảng [-50 50]) • Lưu danh sách này vào file “dsToaDo.inp” • Đọc file “dsToaDo.inp” trên và lưu vào file “toaDoDuong.out” những tọa độ điểm thuộc phần tư thứ nhất 25
  26. Khai báo cấu trúc và hàm struct structPoint { int x; int y; }; typedef structPoint MyPoint; void PhatSinh(MyPoint *a, int n); void XuatMang(MyPoint *a, int n); void LuuFile(MyPoint *a, int n, char *fileName); void LuuToaDoDuong(char *fileIn, char *fileOut); void XuatFile(char *fileName); 26
  27. void PhatSinh(MyPoint *a, int n) { for (int i = 0; i < n; i++) { a[i].x = rand() % 51 - rand() % 51; a[i].y = rand() % 51 - rand() % 51; } } void XuatMang(MyPoint *a, int n) { for (int i = 0; i < n; i++) { printf("(%d, %d); ", a[i].x, a[i].y); } }
  28. void LuuFile(MyPoint *a, int n, char *fileName) { FILE *fp; fp = fopen(fileName, "wb"); for (int i = 0; i < n; i++) { fwrite(&a[i], sizeof(MyPoint), 1, fp); } fclose(fp); }
  29. void LuuToaDoDuong(char *fileIn, char *fileOut) { FILE *fIn, *fOut; fIn = fopen(fileIn, "rb"); fOut = fopen(fileOut, "wb"); MyPoint d; while (fread(&d, sizeof(MyPoint), 1, fIn) > 0) { if (d.x > 0 && d.y > 0) fwrite(&d, sizeof(MyPoint), 1, fOut); } _fcloseall(); }
  30. void XuatFile(char *fileName) { FILE *fp; fp = fopen(fileName, "rb"); MyPoint d; while (fread(&d, sizeof(MyPoint), 1, fp) > 0) { printf("(%d, %d); ", d.x, d.y); } }
  31. int main() { MyPoint *a; int n; srand((unsigned int) time(NULL)); printf("So luong toa do can phat sinh: "); scanf("%d", &n); a = (MyPoint *) malloc(n * sizeof(MyPoint)); PhatSinh(a, n); printf("\n Danh sach toa do duoc phat sinh:\n"); XuatMang(a, n); LuuFile(a, n, "dsToaDo.inp"); LuuToaDoDuong("dsToaDo.inp", "toaDoDuong.out"); //Kiem tra ket qua luu file printf("\n Danh sach toa do trong file:\n"); XuatFile("dsToaDo.inp"); printf("\n Danh sach toa do duong trong file:\n"); XuatFile("toaDoDuong.out"); free(a); getch(); return 0; }
  32. Các thao tác khác trên File • Xóa File remove (đường dẫn tập tin); • Đổi tên File rename (tên tập tin cũ, tên tập tin mới); • Cho biết vị trí con trỏ File ftell (FILE *); 32
  33. Các thao tác khác trên File Di chuyển con trỏ File từ vị trí xuất phát cho trước fseek (FILE *, độ dời, vị trí xuất phát); Các vị trí: • SEEK_SET đầu tập tin (giá trị 0) • SEEK_END cuối tập tin (giá trị 2) • SEEK_CUR vị trí hiện hành (giá trị 1) Độ dời tính bằng byte 33
  34. Bài tập Trong bài tập ví dụ về danh sách tọa độ điểm trong mặt phẳng, bổ sung thêm các hàm thực hiện yêu cầu sau: 1. Nhập một tọa độ điểm từ bàn phím 2. Bổ sung tọa độ điểm này vào cuối file “dsToaDo.inp” 3. Nếu tọa độ điểm vừa nhập có tọa độ thuộc phần tư thứ nhất thì bổ sung thêm vào cuối file “toaDoDuong.out” 4. Xóa tọa độ điểm d cho trước (nếu có xuất hiện) trong file “dsToaDo.inp” và “toaDoDuong.out” 34
  35. Q&A 35