Bài giảng Phương pháp lập trình - Chương 9: Tập tin (File) - Võ Quang Hoàng Khang

pdf 36 trang phuongnguyen 2361
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình - Chương 9: Tập tin (File) - Võ Quang Hoàng Khang", để 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_phuong_phap_lap_trinh_chuong_9_tap_tin_file_vo_qua.pdf

Nội dung text: Bài giảng Phương pháp lập trình - Chương 9: Tập tin (File) - Võ Quang Hoàng Khang

  1. CHƯƠNG 9 TẬP TIN (FILE)
  2. 1. GIỚI THIỆU y C/C++ hổ trợ 2 hệ thống nhập xuất: − Mộthệ thống thừakế từ ngôn ngữ C − Mộthệ thống nhậpxuấthướng đốitượng của C++.
  3. 2. Streams và Files y Hệ thống nhập xuất của C −Cung cấpmột giao diện(interface)nhất quán độc lập với thiết bị thật sự mà chương trình tương tác. −cung cấp một mức độ trừu tượng giữa lập trình viên và thiếtbị nhậpxuất. Sự trừu tượng này được gọi là stream và thiết bị thậtsựđượcgọilàfile.
  4. 3. Streams (dòng nhậpxuất) y Hệ thống file của C được thiết kế để làm việcvớinhiềuloạithiếtbị khác nhau như terminals (thiết bị đầu cuối), các loại ổ đĩa, băng từ, y Hệ thống file chuyển đổi mỗi loại thành một thiếtbị logic gọilàstream. Tấtcả stream có cùng hành vi
  5. 3. Streams (dòng nhậpxuất) y Stream độc lập với thiết bị nên cùng một hoạt động trên stream như ghi vào mộttập tin trên đĩa cũng có thể dùng để ghi vào loại thiếtbị khác như console (màn hình). y Có hai loại stream: −Vănbản(text) −Nhị phân (binary).
  6. 3.1. Text Streams y Một text stream là một chuổi các ký tự. Trong mộttextstream,mộtsố ký tự có thể bị chuyển đổi tùy thuộc môi trường. y Ví dụ,kýtự newline ('\n') có thể bịđổi thành cặp ký tự carriage return/linefeed (ký tự xuống dòng và vềđầudòng).
  7. 3.1. Text Streams y Không có quan hệ một-một giữa các ký tự đượcviết(hayđọc) và những ký tự trên các thiết bị ngoài. Do đó số ký tự được viết (hay đọc) có thể khác số số ký tự trên thiếtbị ngoài.
  8. 3.2. Binary Streams y Một binary stream là một chuổi bytes tương ứng một-mộtvớichuổibytestrên thiết bị ngoài. Nghĩa là không có sự chuyển đổixảyra.Dođó, số bytes đượcviết(hay đọc) thì bằng với số bytes trên thiết bị ngoài.
  9. 4. FILES y Một file có thể là một tập tin trên đĩa, một terminal, hay máy in. y Để tạo kết nối (associate) giữa một stream vớimột file ta dùng hoạt động mở (open). y Khi file được mở, thông tin có thể được trao đổigiữafilevàchương trình.
  10. 4. FILES y Không phải tất cả file đều có cùng khả năng như nhau. y Ví dụ, một tập tin trên đĩa (file) có thể hỗ trợ truy xuấtngẫu nhiên trong khi đómáyin (cũng là file) thì không thể. y “Tấtcả stream là như nhau nhưng file thì không".
  11. 4. FILES y Để ngắt kết nối giữa một stream với một file ta dùng hoạt động đóng (close). Nếu đóng một file đang mở cho xuất (output) thì nội dung củastreamtương ứng đượcviếtra thiết bị ngoài. y Qúa trình này đượcgọi là flushing và đảm bảo là không có thông tin bị để lại trong vùng đệm(buffer).
  12. 4. FILES y Tất cả file được tự động đóng khi chương trình mở chúng kếtthúcbìnhthường. Files không được đóng khi chương trình mở chúng bị kếtthúcbấtthường như bị treo (halt) hay khi chương trình thực hiện hàm abort(). y Mỗi stream liên đới với một file có một cấu trúc kiểuFILE.
  13. 4.1. Cơ bảnvề hệ thống file Các hàm liên quan đến file trong thư viện stdio.h Tên hàm Chứcnăng TênhàmChứcnăng fopen( ) Mở một file fclose( ) Đóng một file. putc( ) Viết một ký tự đến một file. fputc( ) Giống như putc() .
  14. 4.1. Cơ bảnvề hệ thống file Tên Chức năng hàm getc( ) Đọc một ký tự từ một file. fgetc( ) Giống như getc() . fgets( ) Đọcmộtchuổitừ một file. fputs( ) Viết một chuổi đến một file. fseek( ) Tìm mộtbytetrongmột file.
  15. 4.1. Cơ bảnvề hệ thống file Tên Chứcnăng hàm ftell( ) Trả về vị trí hiệnhànhcủacủa file iditindicator. feof( ) Trả về true nếuduyệt đếncuối file (end-of-file). ferror( ) Trả về true nếumột lỗi xảyra. rewind( ) Đưaindicatorvềđầu. remove( ) Xóa một file. fflush( ) Xả hết vùng đệm của file.
  16. 4.2. Con trỏ file (File pointer) y Con trỏ file là một cấu trúc kiểu FILE, trỏ đếnthôngtinvề file như tên file, trạng thái, và vị trí hiện hành của file. y Con trỏ file được dùng bởistreamtương ứng để thực hiện các hoạt động nhập xuất trên file. y Cú pháp khai báo: FILE *fp;
  17. 4.3. Mở file y Hàm fopen() mở một stream và liên kết một file vớistreamđó. Hàm trả về mộtcon trỏ file trỏ đến tập tin được mở. y Cú pháp: FILE *fopen(const char *filename, const char *mode); y filename: chứatên/đường dẫncủa file y mode: cho biếtmở file theo mode nào.
  18. 4.3. Mở file y Các mode để mở tập tin −"r" Nếutậptinđượcmở thành công, hàm fopen() nạp nó vào bộ nhớ và trả về con trỏ trỏđếnkýtựđầutiêncủatậptin. Ngược lại, hàm fopen() trả về NULL −"w" Nếutậptin tồntại, nội dung củanó sẽ bị ghi đè
  19. 4.3. Mở file • "a" Nếu tập tin được mở thành công hàm fopen() nạpnóvàobộ nhớ và trả về con trỏ trỏ đến ký tự cuối cùng của tập tin. Nếu tập tin không tồntại, mộttậptinmới đượctạo. Trả về NULL nếu không thể mở tập tin. • "r+" Nếutậptinđượcmở thành công, hàm fopen() nạp nó vào trong bộ nhớ. Trả về NULL nếu không thể mở tậptin.
  20. 4.3. Mở file y "a+" Nếu tập tin được mở thành công, hàm fopen() nạpnóvàobộ nhớ và trả về con trỏ trỏ đến ký tự đầu tiên của tập tin. Nếu tập tin không tồntại, mộttậptinmới đượctạo. Trả về NULL nếu không thể mở tập tin. y Các hoạt động có thể làm trên tậptin:đọc, ghi thêm nội dung mới vào cuối tập tin. Không thể sửa đổinội dung đang có trong tậptin.
  21. 4.3. Mở file y Ví dụ: FILE *fp; if((fp = fopen("test. txt", "w")) == NULL) { cout << "Cannot open file"; exit(1); }
  22. 4.4. Đóng file y Hàm fclose() đóng stream được mở bởi hàm fopen(). Khi hàm đượcgọi, nó sẽ viếtbấtkỳ dữ liệu nào vẫn còn trong buffer đến file rồi đóng file. y Cú pháp: int fclose(FILE *fp); −fp: là con trỏ file trả về bởi hàm fopen().
  23. 4.5. Ghi mộtkýtựđếnmột file y Có hai hàm xuất ký tự đến file là putc() và fputc(). Hai hàm này là tương đương nhau. Hàm putc() ghi một ký tự đến một file đã đượcmở bởihàmfopen(). y Cú pháp: int putc(int ch, FILE *fp); −fp là con trỏ file trả về bởi hàm fopen() −ch là ký tự đượcviết đến file.
  24. VD: đọckýtự từ bàn phím và ghi vào file đếnkhigặpkt$ void main() { FILE *fp; char ch; if((fp=fopen(“test.txt”, "w"))==NULL) { cout << "Cannot open file.\n"; exit(1); } do { ch = getchar();//đọctừ bàn phím putc(ch, fp);//ghi vào file }while (ch != '$'); fclose(fp);//đóng file }
  25. 4.6. Đọcmộtkýtự từ một file y Hàm để đọc một ký tự từ file:getc() và fgetc() −Đọcmỗi lầnmột ký tự từ file đượcmở bởi hàm fopen() ở chếđộđọc(read). ÙCú pháp: int getc(FILE *fp); Ùfp là con trỏ file kiểuFILE. −Hàm trả về mã ascii củakýtựđược đọc, trả về EOF nếu một lỗi xảy ra.
  26. void main() { FILE *fp; char ch; if((fp=fopen(”test.txt”, "r"))==NULL) { cout << "Cannot open file.\n"; exit(();1); } ch = getc(fp); // đọcmộtkýtự while (ch!=EOF) { putchar(ch); // in ra màn hình ch = getc(fp); }fclose(fp); }
  27. 3.8. Đọcvàviếtchuổitrênfile y fgets(): đọc một chuổi từ stream tương ứng cho đếnkhigặpkýtự newline hay đã đọc được length-1 ký tự. y Hàm trả về str nếu đọc thành công và một con trỏ null nếu không. y Cú pháp: char *fgets(char *str, int length, FILE *fp);
  28. 3.8. Đọcvàviếtchuổitrênfile y fputs() ghi một chuổi trỏ đến bởi str đến stream trỏđếnbởicontrỏ file fp. Hàm trả về EOF nếu một lỗi xảy ra. y Cú pháp: int fputs(const char *str, FILE *fp);
  29. void main(void) { char str[80]; FILE *fp; if((fp = fopen("teststr.txt", "w"))==NULL) { cout << "Cannot open file.\n"; exit(();1); } Do { cout << "Enter a string (CR to quit):\n"; gets(str); strcat(str, "\n"); /* add a newline */ fputs(str, fp); } while(*str!='\nn);'); }
  30. 4.9. Hàm fread() và fwrite() y Hàm fread() và fwrite() : đọc và ghi một khốicủabấtkỳ dữ liệunàocókíchthước lớn hơn 1 byte y Cú pháp: size_t fread(void *buffer, size_t numbytes, size_t count, FILE *fp); size_ t fwrite(const void *buffer , size_ t numbytes, size_ t count,FILE *fp);
  31. 4.10. Hàm rewind() y Hàm rewind() di chuyển indicator đến điểm bắt đầucủafile. y Hàm có prototype như sau: void rewind(FILE *fp);
  32. 4.11. Hàm ferror() y Hàm ferror() cho biết một hoạt động trên file đãgâyralỗi. y Cú pháp: int ferror(FILE *fp); y Hàmtrả về true nếumột lỗi đã xảyravới hoạt động trên file trướckhigọihàm ferror(),ngược lạitrả về flfalse.
  33. 4.12. Xóa file y Hàm remove() dùng để xóa tập tin. y Cú pháp: int remove(const char *filename); y Hàm trả về zero nếuxóathànhcông,ngược lạitrả về nonzero
  34. 4.13. Flushing a stream y Hàm fflush() dùng để xuất tất cả nội dung còn lạitrongbuffercủastream. y Cú pháp: int fflush(FILE *fp); y Hàm ghi nội dung còn trong buffer đếnfile fp. Nếu gọi hàm fflush() không có đối số thì tấtcả file đang mở. y Hàmtrả về 0 nếuthành công,ngược lạitrả về EOF
  35. 5. Truy xuất file ngẫu nhiên y Để đọc hay viết từ hay đến một vị trí bất kỳ trong file ta cầnsự giúp đỡ củahàm fseek(). Hàm này dùng để di chuyển chỉ báo file. y Cú pháp: int fseek(FILE *fp, long numbytes, int origin);
  36. 6. Các stream chuẩn y Khi một chương trình thực thi, ba stream được mở tự động. Đó là stdin (standard input), stdout (standard output), và stderr (standard error). stdin dùng để đọctừ bàn phím, stdout và stderr dùng để viết đến màn hình. y Bởi vì standard streams là các con trỏ file nên có thể dùng các hàm nhập xuất trên chúng.