Bài giảng Ngôn ngữ lập trình C - Chương 6: Dữ liệu kiểu tệp - Ninh Thị Thanh Tâm

pdf 33 trang phuongnguyen 6430
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C - Chương 6: Dữ liệu kiểu tệp - Ninh Thị Thanh Tâm", để 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:

  • pdfbai_giang_ngon_ngu_lap_trinh_c_chuong_6_du_lieu_kieu_tep_nin.pdf

Nội dung text: Bài giảng Ngôn ngữ lập trình C - Chương 6: Dữ liệu kiểu tệp - Ninh Thị Thanh Tâm

  1. NGÔN NGỮ LẬP TRÌNH C Dữ liệu kiểu tệp Ninh Thị Thanh Tâm Khoa CNTT – HV Quản lý Giáo dục
  2. Mục đích  Biết các thao tác xử lý tệp như tạo tệp, đọc ghi tệp  Xử lý tệp truy cập tuần tự  Xử lý tệp truy cập ngẫu nhiên
  3. Nội dung  Khái niệm về tệp  Các hàm vào ra tệp cơ bản  Các hàm thao tác vào ra tệp mức thấp
  4. Khái niệm về tệp  Đường dẫn truy cập các tệp  Thẻ tệp (file handle)  Các thông tin về tệp  Các kiểu vào ra với tệp
  5. Khái niệm về tệp  Đường dẫn truy cập các tệp Tên ổ đĩa Tên các thư mục Tên tệp Phần mở rộng  Thẻ tệp (file handle) Là một số nguyên hệ điều hành trả lại khi tạo hay mở tệp Dùng để truy cập đến một cấu trúc lưu trữ các thông tin cần thiết cho các thao tác với tệp
  6. Khái niệm về tệp  Các thông tin về tệp Các thuộc tính của tệp đã mở Kích thước và trạng thái tệp Chế độ truyền: nhị phân và văn bản  Các kiểu vào ra với tệp Các hàm vào ra theo dòng qua vùng đệm Các hàm vào ra tệp mức thấp, không qua vùng đệm
  7. Các hàm vào ra tệp cơ bản Tên hàm Chức năng fopen() Mở tệp fclose() Đóng tệp putc() Ghi một kí tự lên tệp getc() Đọc một kí tự từ tệp fseek() Di chuyển con trỏ tệp đến một byte được chỉ định fprintf() Ghi lên tệp fscanf() Nhập dữ liệu từ tệp fflush() ghi ra tệp nội dung trên vùng đệm feof() Trả về giá trị khác 0 nếu con trỏ ở cuối tệp ferror() Trả về giá trị khác 0 nếu có lỗi xuất hiện trong thao tác rewind() Đưa con trỏ về đầu tệp
  8. Con trỏ tệp  Là một con trỏ kiểu FILE  Chỉ đến vùng nhớ chứa các thông tin liên quan đến tệp Tên tệp Tình trạng Vị trí đang làm việc
  9. Con trỏ tệp Chế độ Ý nghĩa “r” Mở tệp để đọc, trả lại lỗi nếu tệp không tồn tại “w” Mở tệp để ghi, nếu tệp đã tồn tại, nội dung sẽ bị xóa “a” Mở tệp để ghi thêm vào cuối tệp “r+” Mở tệp để đọc và ghi, fopen trả lại lỗi nếu tệp không tồn tại “w+” Mở một tệp mới để đọc và ghi, nội dung bị xóa nếu tệp tồn tại “a+” Mở một tệp để ghi vào cuối tệp “t” Mở tệp theo kiểu văn bản “b” Mở tệp theo kiểu nhị phân
  10. Hàm fopen()  Mở tệp  Hàm nguyên mẫu: FILE *fopen(const char *filename, const char *mode); filename là xâu kí tự gồm tên tệp và đường dẫn tới tệp mode là trạng thái làm việc của tệp sau khi mở  Kết quả NULL nếu thất bại Con trỏ tệp nếu mở tệp thành công
  11. Ví dụ fp = fopen("readme.txt","rt"); if (fp==NULL){ printf("Khong mo duoc tep"); exit(0); }
  12. Hàm putc()  Ghi một kí tự lên tệp đã được mở  Hàm nguyên mẫu: int putc(int ch, FILE *fp) fp là con trỏ tệp trả về trong thao tác mở tệp ch là kí tự cần ghi lên tệp  Kết quả Thành công: trả lại kí tự vừa ghi được Thất bại: trả lại EOF
  13. Hàm getc()  Đọc một kí tự từ tệp đã được mở  Hàm nguyên mẫu: int getc(FILE *fp) fp là con trỏ tệp trả về trong thao tác mở tệp  Kết quả Thành công: trả lại kí tự vừa đọc được Thất bại: trả lại EOF
  14. Ví dụ  Đọc đến cuối tệp văn bản ch = getc(); while (ch!=EOF) { ch = getc(fp); }  Đọc tệp nhị phân khi gặp kí tự kết thúc tệp while (!feof(fp)) ch = getc(fp);
  15. Hàm fclose()  Đóng tệp đã được mở  Hàm nguyên mẫu: int fclose(FILE *fp) fp là con trỏ tệp trả về trong thao tác mở tệp  Kết quả Thành công: trả lại 0 Thất bại: trả lại EOF
  16. Ví dụ - sao chép tệp /*filecopy.c*/ #include #include void main(){ FILE *fin, *fout; char ch; fin = fopen("filecopy.c","rb"); if (fin == NULL) { printf("Khong mo duoc tep nguon\n"); exit(1); } fout = fopen("fout.dat", "wb"); if (fout==NULL){ printf("Khong mo duoc tep dich\n"); exit(1); } while (!feof(fin)) putc(getc(fin), fout); fclose(fin); fclose(fout); }
  17. Hàm ferror()  Kiểm tra thao tác truy xuất trên tệp trước đó có lỗi hay không  Hàm nguyên mẫu int ferror(FILE *fp);  Kết quả Bằng 0, nếu thao tác trước đó không có lỗi Khác 0, ngược lại
  18. Hàm rewind()  Đưa con trỏ về đầu tệp  Hàm nguyên mẫu int rewind(FILE *fp);
  19. Hàm getw() và putw()  Đọc/ghi các số nguyên 2 byte  Hàm nguyên mẫu int getw(FILE *fp); int putw(int w, FILE *fp);
  20. Hàm fgets() và fputs()  Đọc/ghi các chuỗi kí tự  Hàm nguyên mẫu char *fgets(char *str, int num, FILE *fp); char *fputs(char *str, FILE *fp);
  21. Hàm fread() và fwrite()  Đọc/ghi các khối dữ liệu  Hàm nguyên mẫu int fread(void *buffer, int so_byte, int so_muc, FILE *fp); int fwrite(void *buffer, int so_byte, int so_muc, FILE *fp);
  22. Ví dụ  Nhập tên tệp văn bản; đọc và in nội dung lên màn hình
  23. /*readfile.c*/ #include #include void main(){ FILE *fp; char filename[50]; char w[300]; printf("Nhap ten tep:"); gets(filename); fp = fopen(filename,"r"); if (!fp){ printf("Khong mo duoc tep nguon\n"); exit(1); } while (fgets(w,300,fp)) puts(w); fclose(fp); getch(); }
  24. Ví dụ  Lập một tệp văn bản in lại 50 số nguyên tố đầu tiên, mỗi dòng 10 số. Đọc và in nội dung tệp.
  25.  /*filent.c*/  #include  #include  int ktnt(int);  void laptep(char *);  void doctep(char *);
  26. void main(){ int chon; printf("Lap tep go 1, doc tep go 0\n"); scanf("%d",&chon); if (chon==1) laptep("nto.dat"); if (chon==0) doctep("nto.dat"); getch(); } int ktnt(int k){ int i; if (k==1||k==0) return 0; for (i=2; i 1; }
  27. void laptep(char *filename){ FILE *f; int i; int k = 2; f = fopen(filename,"w"); if (!f){ printf("Khong tao duoc tep.\n"); exit(1); } for (i=1; i<=50; i++){ while (!ktnt(k)) k++; fprintf(f,"%6d",k); if(i%10==0) fprintf(f,"\n"); k++; } fclose(f); }
  28. void doctep(char *filename){ FILE *f; int x; f = fopen(filename,"r"); if (!f){ printf("Khong mo duoc tep\n"); exit(1); } while (!feof(f)){ fscanf(f,"%d",&x); printf("%5d",x); } fclose(f); }
  29. Ví dụ  Lập trực tiếp một tệp văn bản ghi một ma trận số thực Dòng 1: ghi thông báo Dòng 2: ghi số hàng, số cột của ma trận  Lập chương trình: đọc tệp văn bản và nhập ma trận vào bộ nhớ động. In ma trận vào tệp
  30. /*filemt.c*/ #include #include int n, m; float *nhap(char *); float shang(float *, int); float scot(float *, int); void inmt(float *); void ghitep(float *, char *); void main(){ float *a; char *tep1 = "mt.dat"; char *tep2 = "luu.dat"; clrscr(); a = nhap(tep1); inmt(a); ghitep(a,tep2); getch(); }
  31. float *nhap(char *tep){ float *x, *p; char w[300]; FILE *f; f = fopen(tep, "r"); if (!f){ printf("Khong mo duoc tep.\n"); exit(1); } fscanf(f,"%d%d ",&n,&m); x = (float*)calloc(m*n,sizeof(float)); if (!x){ printf("Loi cap phat bo nho.\n"); getch(); exit(1); } for (p=x; p<x+n*m; p++) fscanf(f,"%f ", p); fclose(f); return x; }
  32. float shang(float *x, int k){ float s = 0; int j; for (j=0; j<m; j++) s = s + x[k*m+j]; return s; } float scot(float *x, int k){ float s = 0; int i; for (i=0; i<n; i++) s = s + x[i*m+k]; return s; } void inmt(float *x){ int i, j; for (i=0; i<n; i++){ for (j=0; j<m; j++) printf("%5.1f",*(x+i*m+j)); printf("\n"); }
  33. void ghitep(float *x, char *tep){ FILE *f; int i, j; f = fopen(tep, "w"); if (!f){ printf("Loi mo tep.\n"); exit(0); } fprintf(f,"Ma tran ket qua\n"); fprintf(f,"%d\t%d\n",n,m); for (i=0; i<n; i++){ for (j=0; j<m; j++) fprintf(f,"%5.1f",x[i*m+j]); fprintf(f,"%5.1f\n",shang(x,i)); } fprintf(f,"\n"); for(j=0; j<m; j++) fprintf(f,"%5.1f",scot(x,j)); fclose(f); }