Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
250,5 KB
Nội dung
Kỹ thuật lập trình(5): ngơn ngữ lập trình C Tống Minh Đức Khoa Công nghệ thông tin Học viện Kỹ thuật Quân 100 – Hoàng Quốc Việt – Hà Nội Làm việc với tệp Tìm hiểu thao tác tệp Ngôn ngữ C định nghĩa (trong tệp stdio.h) Mở tệp, Đóng tệp, Đọc, Ghi, … cấu trúc kiểu tệp FILE mã kết thúc tệp EOF (-1) hàm thao tác tệp Khai báo trỏ tệp Aug 28, 2014 FILE *pf; Làm việc với tệp Cấu trúc chung tệp tin đĩa Một tệp tin dãy byte có giá trị từ đến 255 Số byte kích thước (size) tệp Khi đọc cuối tệp ta nhận mã kết thúc tệp EOF Tệp tin chia làm hai loại Aug 28, 2014 Tệp tin văn Tệp tin nhị phân Làm việc với tệp Dòng chảy (stream) Trước tệp tin đọc hay ghi, cấu trúc liệu gọi dòng chảy phải liên kết với Một dịng chảy mà trỏ đến cấu trúc Có dịng chảy mở cho chương trình C Aug 28, 2014 stdin (standard input): nối với bàn phím để đọc stdout (standard output), stderr (standard error):được nối với hình để ghi Làm việc với tệp Dịng chảy ? Aug 28, 2014 Dòng chảy tạo vùng đệm (buffer) chương trình chạy tệp tin đĩa Làm giảm việc chương trình truy cập trực tiếp thiết bị phần cứng (vd đĩa) Làm việc với tệp văn Mở tệp Muốn thao tác tệp trước hết phải mở tệp Mở tệp với hàm fopen FILE *fopen(const char *name, const char *mode) Aug 28, 2014 Hàm trả trỏ đến cấu trúc tệp hay dòng chảy tương ứng, không thành công trả NULL name tên tệp tin cần mở mode kiểu mở “w”: mở để ghi “r”: mở để đọc “a”: mở để ghi vào cuối tệp Làm việc với tệp văn Mở tệp Ví dụ #include int main(void) { FILE *in, *out, *append; Aug 28, 2014 in = fopen("dulieu.txt","r"); out = fopen("dulieu.txt", "w"); append = fopen("dulieu.txt", "a"); Làm việc với tệp văn Mở tệp #include int main(void) { FILE *in; if ((in = fopen("dulieu.txt","r")) == NULL) { fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); exit(1); } Aug 28, 2014 Làm việc với tệp văn Đóng tệp Phải đóng tệp khơng làm việc với Dùng hàm fclose int fclose(FILE *fp) Aug 28, 2014 fp dịng chảy hay trỏ tệp cần đóng Hàm trả thành công, ngược lại trả EOF Ví dụ fclose(in); Làm việc với tệp văn Báo lỗi hệ thống Dùng hàm perror void perror(const char *str) trả thông báo lỗi hệ thống Ví dụ FILE *in; if ((in = fopen("dulieu.txt","r")) == NULL) { fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); perror("lý do: "); exit(1); lý do: no such file or directory } Aug 28, 2014 10 Làm việc với tệp văn Ví dụ: chép tệp tin Aug 28, 2014 #include main() { int c; FILE *in, *out; char in_name[80], out_name[80], str[80]; printf("Nhập tên tệp nguồn: "); scanf("%s", in_name); if ((in = fopen(in_name,"r")) == NULL){ fprintf(stderr,"Không thể mở tệp: %s\n", in_name); perror("Lý do:"); exit(1); } printf("Nhập tên tệp đích: "); scanf("%s", out_name); if ((out = fopen(out_name, "w")) == NULL){ fprintf(stderr,"Không thể mở tệp: %s\n", out_name); perror("Lý do:"); exit(1); } while (fgets(str, 80, in) != NULL) fputs(str, out); fclose(in); fclose(out); } 16 Làm việc với tệp văn Ví dụ: chép tệp tin Chúng ta muốn sử dụng: mycopy source dest↵ Aug 28, 2014 Sử dụng đọc tham số từ dòng lệnh Dịng lệnh đọc tham số hàm main, theo qui ước tham số gọi “argc” “argcv” int main(int argc, char *argv[]) Tham số “argc” chứa số từ dòng lệnh, kế tên chương trình Tham số “argv” chứa danh sách trỏ đến từ dòng lệnh 17 Làm việc với tệp văn Ví dụ: chép tệp tin Aug 28, 2014 #include int main(int argc, char *argv[]) { int c; FILE *in, *out; if (argc != 3){ fprintf(stderr,"Cú pháp: 'copy source dest'\n"); return 1; } if ((in = fopen(argv[1],"r")) == NULL){ fprintf(stderr,"Không thể mở tệp: %s\n", argv[1]); perror("Lý do:"); return 1; } if ((out = fopen(argv[2], "w")) == NULL){ fprintf(stderr,"Không thể mở tệp: %s\n", argv[2]); perror("Lý do:"); return 1; } while ((c = fgetc(in)) != EOF) fputc(c, out); fclose(in); fclose(out); return 0; } 18 Làm việc với tệp văn Đọc/Ghi liệu tệp theo định dạng Đọc liệu theo định dạng fscanf int fscanf(FILE *fp, const char *chuỗi_điều_khiển, danh_sách_đối) Đọc liệu từ tệp trỏ fp theo định dạng chuỗi điều khiển vào danh cách đối, sử dụng tương tự hàm scanf Ghi liệu theo định dạng fprintf int fprintf(FILE *fp, const char *chuỗi_điều_khiển, danh_sách_đối) Aug 28, 2014 Ghi liệu vào tệp trỏ fp theo định dạng chuỗi điều khiển từ danh cách đối, sử dụng tương tự hàm printf 19 Làm việc với tệp văn Ví dụ … FILE *in, *out; … int i, j, k; float f; … fscanf(in, "%d|%d|%d|%f", &i, &j, &k, &f); fprintf(out, "%d:%d:%d:%f", i, j, k, f); … Aug 28, 2014 20 Làm việc với tệp văn Ngồi hàm trình bày trên, C cung cấp nhiều hàm khác Aug 28, 2014 Tự tìm hiểu fcloseall, ferror, feof, unlink, remove, fseek, … 21 Làm việc với tệp nhị phân C cho phép thao tác tệp nhị phân Aug 28, 2014 Truy cập tệp cách ngẫu nhiên dễ dàng Dữ liệu đọc ghi khối (blocs) Tệp nhị phân tệp văn có khác xử lí mã chuyển dịng (newline) mã kết thúc tệp (end of file) Hầu hết hàm dùng cho tệp văn sử dụng cho tệp nhị phân, ngoại trừ hàm fgets, fputs Khi sử dụng hàm fopen sử dụng thêm tùy chọn “b” để mở tệp nhị phân Ngoài ra, C cung cấp thêm số hàm đọc ghi riêng cho tệp nhị phân 22 Làm việc với tệp nhị phân Ví dụ Aug 28, 2014 #include main() { FILE *out, *in; int i = 11, j = 12; char ch = 'a'; char str[80] = "end."; if ((out = fopen("bifile.dat", "wb")) == NULL){ fprintf(stderr,"impossible to open: bifile.dat\n"); perror("Because:"); exit(1); } fputc(ch, out); fprintf(out, "\n%i:%i\n%s", i, j, str); fclose(out); if ((in = fopen("bifile.dat", "rb")) == NULL){ fprintf(stderr,"impossible to open: bifile.dat\n"); perror("Because:"); exit(1); } ch = fgetc(in); fscanf(in, "%i:%i%s", &i, &j, str); fprintf(stdout, "%c\n%i:%i\n%s\n", ch, i, j, str); fclose(in); 23 } Làm việc với tệp nhị phân Vấn đề với mã kết thúc tệp Aug 28, 2014 Mã kết thúc tệp kiểu văn 26 (ControlZ) Khi đọc kí tự tệp kiểu văn bản, gặp kí tự giá trị EOF trả kết thúc việc đọc Kiểu nhị phân không không coi mã kết thúc tệp 26 Để đọc tất kí tự tệp, nên đọc kiểu nhị phân 24 Làm việc với tệp nhị phân Ví dụ #include main() { FILE *textfile, *binaryfile; if ((textfile = fopen(“textfile.dat", "w")) == NULL){ fprintf(stderr,"impossible to open: textfile.dat\n"); perror("Because:"); exit(1); } if ((binaryfile = fopen(" binaryfile.dat", “wb")) == NULL){ fprintf(stderr,"impossible to open: binaryfile.dat\n"); perror("Because:"); exit(1); } fputc(‘A’, textfile); fputc(26, textfile); fputc(‘B’, textfile); fputc(‘A’, binaryfile); fputc(26, binaryfile); fputc(‘B’, binaryfile); fcloseall(); } Aug 28, 2014 Điều xảy đọc tệp kiểu văn ? 25 Làm việc với tệp nhị phân Vấn đề với mã chuyển dòng (newline) Đối với kiểu văn Đối với kiểu nhị phân Aug 28, 2014 Khi ghi vào tệp mã chuyển dịng ‘\n’, hai kí tự ghi vào tệp ‘\r’ ‘\n’ (kí tự ‘\r’ chuyển cột ‘\n’ chuyển sang dịng mới) Khi đọc hai kí tự ‘\r’ ‘\n’ nhận biết kí tự ‘\n’ Khi ghi vào tệp ‘\n’, kí tự ‘\n’ ghi vào tệp 26 Làm việc với tệp nhị phân Ví dụ … FILE *bf, *tf; … tf = fopen(“txtfile”, “w”); fprintf(“hi\n”); kí tự ghi vào tệp: ‘h’, ‘i’, ‘\r’, ‘\n’ … bf = fopen(“binfile”, “wb”); fprintf(“hi\n”); Aug 28, 2014 … kí tự ghi vào tệp: ‘h’, ‘i’, ‘\n’ 27 Làm việc với tệp nhị phân Các hàm đọc/ghi theo kiểu nhị phân Aug 28, 2014 int putw(int n, FILE *fp) dùng để ghi số nguyên (2 bytes) lên tệp int getw(FILE *fp) dùng để đọc số nguyên (2 bytes) từ tệp int fwrite(void *ptr, int size, int n, FILE *fp) dùng để ghi n mẫu tin kích thước size từ vùng nhớ trỏ ptr lên tệp fp, hàm trả số mẫu tin thực ghi int fread(void *ptr, int size, int n, FILE *fp) dùng để đọc n mẫu tin kích thước size từ tệp fp lên vùng nhớ trỏ ptr, hàm trả số mẫu tin thực đọc Các hàm fread fwrite thường dùng để đọc/ghi mẫu tin cấu trúc, số thực, … 28 Làm việc với tệp nhị phân Ví dụ Aug 28, 2014 #include main() { FILE *out, *in; int i; if ((out = fopen("bifile.dat", "wb")) == NULL){ fprintf(stderr,"impossible to open: bifile.dat\n"); perror("Because:"); exit(1); } for(i = 0; i 0) fwrite(str, 1, n, out); fclose(in); fclose(out); return 0; } 30 ... trình chạy tệp tin đĩa Làm giảm việc chương trình truy cập trực tiếp thiết bị phần cứng (vd đĩa) Làm việc với tệp văn Mở tệp Muốn thao tác tệp trước hết phải mở tệp Mở tệp với hàm fopen FILE... fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); exit(1); } Aug 28, 2014 Làm việc với tệp văn Đóng tệp Phải đóng tệp khơng làm việc với Dùng hàm fclose int fclose(FILE *fp) Aug 28, 2014 fp... 19 Làm việc với tệp văn Ví dụ … FILE *in, *out; … int i, j, k; float f; … fscanf(in, "%d|%d|%d|%f", &i, &j, &k, &f); fprintf(out, "%d:%d:%d:%f", i, j, k, f); … Aug 28, 2014 20 Làm việc với