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

Giới thiệu tập tin Các bước xử lý tập tin Đọc – Ghi tập tin văn bản (Text file) Đọc – Ghi tập tin nhị phân (Binary file) Tập tin là một tập hợp thông tin được đặt tên và được chứa trong các thiết bị lưu trữ ngoài của máy tính như: đĩa cứng, đĩa mềm, CD, DVD,… Một tập tin luôn luôn kết thúc bằng 1 ký tự đặc biệt ký hiệu là EOF (End Of File) Tập tin gắn liền với bộ nhớ đệm (buffer) trong đó các thông tin dữ liệu được lưu trữ tạm thời trước khi có sự trung chuyển giữa bộ nhớ máy tính và tập tin

ppt56 trang | Chia sẻ: candy98 | Lượt xem: 459 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Phương pháp lập trình - Chương 9: Tập tin (File), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TẬP TIN (File)Chương 9Nội dung trình bàyGiới thiệu tập tinCác bước xử lý tập tinĐọc – Ghi tập tin văn bản (Text file)Đọc – Ghi tập tin nhị phân (Binary file)21. Giới thiệu tập tinTập tin là một tập hợp thông tin được đặt tên và được chứa trong các thiết bị lưu trữ ngoài của máy tính như: đĩa cứng, đĩa mềm, CD, DVD,Một tập tin luôn luôn kết thúc bằng 1 ký tự đặc biệt ký hiệu là EOF (End Of File)Tập tin gắn liền với bộ nhớ đệm (buffer) trong đó các thông tin dữ liệu được lưu trữ tạm thời trước khi có sự trung chuyển giữa bộ nhớ máy tính và tập tin31. Giới thiệu tập tinĐể tạo kết nối với một tập tin, dùng lệnh fopenKhi tập tin được mở, thông tin có thể được trao đổi giữa tập tin đó với chương trìnhĐể ngắt kết nối với một tập tin, dùng lệnh fcloseNếu đóng một tập tin đang mở thì nội dung của vùng đệm tương ứng được ghi ra thiết bị ngoàiQuá trình này được gọi là flushing và đảm bảo là không có thông tin bị để lại trong vùng đệm41. Giới thiệu tập tin: Minh họa5Dữ liệu đang xử lýTập tinabcVùng đệm (buffer)acacfclose1. Giới thiệu tập tinCó 2 loại tập tin:Tập tin văn bảnTập tin nhị phânTập tin văn bảnLà tập tin mà các phần tử của nó là các ký tựMỗi lần đọc hay ghi là đọc hay ghi một ký tựKhi xử lý ký tự chuyển dòng LF được chuyển thành 2 ký tự CR và LFTập tin nhị phânLà tập tin mà các phần tử là các số nhị phân biểu diễn thông tinViệc đọc hay ghi tuỳ thuộc vào người lập trình6Nội dung trình bàyGiới thiệu tập tinCác bước xử lý tập tinĐọc – Ghi tập tin văn bản (Text file)Đọc – Ghi tập tin nhị phân (Binary file)7Các bước xử lý tập tinCó 4 bước cơ bản để xử lý tập tinKhai báo biến tập tinMở tập tin để ghi hoặc đọcGhi hoặc đọc tập tin (xử lý dữ liệu)Đóng tập tin8Các bước xử lý tập tin: Bước 1Có 4 bước cơ bản để xử lý tập tinKhai báo biến tập tin:Ví dụ: FILE *fp;FILE *Tên_con_trỏ;9Các bước xử lý tập tin: Bước 2Có 4 bước cơ bản để xử lý tập tinMở tập tin: fopenfilename: chứa đường dẫn và tên của tập tin cần mởmode: cho biết mở tập tin theo kiểu nàor (đọc)w (ghi)a (ghi tiếp vào cuối tập tin)r+ (đọc và ghi)w+ (đọc và ghi, nhưng ghi đè lên nội dung cũ của tập tin)a+ (đọc và ghi vào cuối tập tin)rb, wb, ab, rb+, r+b, wb+, w+b, ab+, a+b giống như các trường hợp trên nhưng chỉ dùng cho tập tin nhị phânFILE* fopen( const char* filename, const char* mode );10Các bước xử lý tập tin: Ví dụVí dụ: Mở tập tinFILE *fp;fp = fopen("d:\\test.txt","w");if (fp == NULL){ cout #include void main(){ FILE *fp; fp = fopen("thidu.dat","w"); if (fp==NULL) { cout0 nếu ghi thành công, ngược lại hàm trả về EOF nếu có lỗi xảy raint fputs( const char *str, FILE *fp );20Ví dụ: fputsvoid main(){char str[80]; FILE *fp;if ( (fp = fopen("teststr.txt", "w")) == NULL ){cout void main() { FILE *f; f = fopen("D:\\songuyen.dat", "wb"); if ( f == NULL ) { cout void main() { int k; FILE *f = fopen("D:\\songuyen.dat", "rb"); if (f == NULL) for( int i=1; i void main() { int k; FILE *f = fopen("D:\\songuyen.dat", "rb"); if (f == NULL) fclose(f); }30while ( (fread(&i, sizeof(int), 1, f)) != 0){ cout thông báo “Không có phần tử trong têp” -Ngược lại : Đưa dữ liệu ra. 38TỆP NHỊ PHÂN3. Truy nhập trực tiếp dữ liệu nhị phân Ở ví dụ trên ta làm như sau : fseek(fpt, 0,2); //di chuyển về cuối tệp kich_thuoc=ftell(fpt); if (kich_thuoc<n*sizeof(int)) printf(“da vuot ra khoi kich thuoc tep”); else{ fseek(fpt,(n-1)*sizeof,0); printf(“gia trị so thu %d la %d”,n,x); }396. Các stream chuẩnKhi 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 để đọc từ bàn phím, stdout và stderr dùng để viết đến màn hình.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.404.10. Hàm rewind()Hàm rewind() di chuyển indicator đến điểm bắt đầu của file. Hàm có prototype như sau: void rewind(FILE *fp);414.11. Hàm ferror()Hàm ferror() cho biết một hoạt động trên file đã gây ra lỗi. Cú pháp:int ferror(FILE *fp);Hàm trả về true nếu một lỗi đã xảy ra với hoạt động trên file trước khi gọi hàm ferror(), ngược lại trả về false.424.12. Xóa fileHàm remove() dùng để xóa tập tin. Cú pháp:int remove(const char *filename);Hàm trả về zero nếu xóa thành công, ngược lại trả về nonzero432. Streams và FilesHệ thống nhập xuất của C Cung cấp mộ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ết bị nhập xuất. Sự trừu tượng này được gọi là stream và thiết bị thật sự được gọi là file.443. Streams (dòng nhập xuất)Hệ thống file của C được thiết kế để làm việc với nhiều loại thiết bị khác nhau như terminals (thiết bị đầu cuối), các loại ổ đĩa, băng từ, ... Hệ thống file chuyển đổi mỗi loại thành một thiết bị logic gọi là stream. Tất cả stream có cùng hành vi453. Streams (dòng nhập xuất)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ột tập tin trên đĩa cũng có thể dùng để ghi vào loại thiết bị khác như console (màn hình). Có hai loại stream: Văn bản (text) Nhị phân (binary).463.1. Text StreamsMột text stream là một chuổi các ký tự. Trong một text stream, một số ký tự có thể bị chuyển đổi tùy thuộc môi trường.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ề đầu dòng). 473.1. Text StreamsKhông có quan hệ một-một giữa các ký tự được viế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ết bị ngoài.483.2. Binary StreamsMột binary stream là một chuổi bytes tương ứng một-một với chuổi bytes trên thiết bị ngoài. Nghĩa là không có sự chuyển đổi xảy ra. Do đó, số bytes được viết (hay đọc) thì bằng với số bytes trên thiết bị ngoài.494.1. Cơ bản về hệ thống fileTên hàmChức năngTên hàmChức năngfopen( )Mở một filefclose( )Đóng một file.putc( )Viết một ký tự đến một file.fputc( )Giống như putc() .Các hàm liên quan đến file trong thư viện stdio.h504.1. Cơ bản về hệ thống fileTên hàmChức nănggetc( )Đọc một ký tự từ một file.fgetc( )Giống như getc() .fgets( )Đọc một chuổi từ một file.fputs( )Viết một chuổi đến một file.fseek( )Tìm một byte trong một file.514.1. Cơ bản về hệ thống fileTên hàmChức năngftell( )Trả về vị trí hiện hành của của file indicator.feof( )Trả về true nếu duyệt đến cuối file (end-of-file).ferror( )Trả về true nếu một lỗi xảy ra.rewind( )Đưa indicator về đầu.remove( )Xóa một file.fflush( )Xả hết vùng đệm của file.524.2. Con trỏ file (File pointer)Con trỏ file là một cấu trúc kiểu FILE, trỏ đến thông tin về file như tên file, trạng thái, và vị trí hiện hành của file. Con trỏ file được dùng bởi stream tương ứng để thực hiện các hoạt động nhập xuất trên file. Cú pháp khai báo:FILE *fp;534.3. Mở fileCác mode để mở tập tin"r" Nếu tập tin được mở thành công, hàm fopen() nạp nó vào bộ nhớ và trả về con trỏ trỏ đến ký tự đầu tiên của tập tin. Ngược lại, hàm fopen() trả về NULL"w" Nếu tập tin tồn tại, nội dung của nó sẽ bị ghi đè544.3. Mở file"a" Nếu tập tin được mở thành công hàm fopen() nạp nó vào bộ 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ồn tại, một tập tin mới được tạo. Trả về NULL nếu không thể mở tập tin."r+" Nếu tập tin được mở 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ập tin.554.3. Mở file"a+" Nếu tập tin được mở thành công, hàm fopen() nạp nó vào bộ 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ồn tại, một tập tin mới được tạo. Trả về NULL nếu không thể mở tập tin.Các hoạt động có thể làm trên tập tin: đọc, ghi thêm nội dung mới vào cuối tập tin. Không thể sửa đổi nội dung đang có trong tập tin.56