xử lý file trong lập trình

27 274 0
xử lý file trong lập trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

File 2.1. Các khái niệm CHƯƠNG TRÌNH Tên file, thị đọc ghi Hệ điều hành Con trỏ file (file ID) Thiết bị lưu trữ 2.1. Các khái niệm Có hai cách nhìn nhận cấu trúc file cách nhìn logic cách nhìn vật lý. Trong cách nhìn logic, phần tử file lưu trữ liên tục, phần từ có địa chỉ, địa 0. Khi truy xuất phần tử xem truy xuất khối phần tử, khối có n phần tử. sizeof (item) 2*sizeof (item) Current Pos EOF 2.1. Các khái niệm Trong cách nhìn vật lý: Dữ liệu file phân bố sector, sector liên tục rời rạc với nhau. Truy xuất liệu, ta cần truy xuất sector file. 2.1. Các khái niệm Dạng nhị phân: liệu xem số nhị phân. Dạng văn bản: liệu chuỗi ký tự liên tục. Mở file chế độ văn FILE*fTXT; fTXT = fopen(“filename”,”wt”); // mở để ghi/tạo mới. fTXT = fopen(“filename”,”rt”); // mở để đọc. fTXT = fopen(“filename”,”r+t”); // mở để đọc/ghi. 2.1. Các khái niệm Xử lý lỗi mở file if(fTXT = =null) { printf(“loi mo file. Ma loi = %d. Noi dung loi: %d”, errno, strerrno(errno)); return 0; } 2.1. Các khái niệm Truy xuất phần tử thứ i file văn for(int j = 0; j < i ; j++) fscanf(“%d”,&item); Ghi phần tử lên file văn bản: FILE *fTXT = fopen(“filename”, “wt”); fputc(‘A’, fTXT); fputc(26, fTXT); fputc(10, fTXT); fputc(‘B’, fTXT); Kết sau ghi: 65 26 13 10 66 2.1. Các khái niệm Đọc liệu file từ file văn fTXT: 65 26 13 10 66 FILE*fTXT = fopen(“filename”, “rt”); char c; while(!eof(fTXT)) { c = fgetc(fTXT); printf(“%c”,c); } Kết quả: A 2.1. Các khái niệm Mở file chế độ nhị phân FILE*fBIN; fBIN = fopen(“filename”,”wb”); // mở để ghi/tạo fTXT = fopen(“filename”,”rb”); // mở để đọc. fTXT = fopen(“filename”,”r+b”); // mở để đọc/ghi fTXT = fopen(“filename”,”ab”); // mở để thêm vào cuối 2.1. Các khái niệm Truy xuất ngẫu nhiên phần tử thứ i //chuyển đến phần tử thứ I tính từ phần tử fseek(f, i*sizeof(item), SEEK_SET); //đọc phần tử thứ i. fread(&item, sizeof(item), 1, f); 10 2.1. Các khái niệm Ghi phần tử lên file nhị phân FILE *fBIN; fBIN = fopen(“filename”, “wb”); fputc(‘A’, fBIN); fputc(26, fBIN); fputc(10, fBIN); fputc(‘B’, fBIN); Kết quả: 65 26 10 66 (4 byte) 12 2.1. Các khái niệm Đọc liệu file nhị phân fBIN = fopen(“filename”, “rb”); char c; while(!eof(fBIN)){ c = fgetc(fBIN); printf(“%c”,c); } Kết quả: A 26 10 B 13 2.1. Các khái niệm Lỗi Update FILE*fBIN fBIN = fopen(“filename”, “r+b”); while(fread(&x, sizeof(x), 1, fBIN)) if(x == 0) { x++; fseek(fBIN, -sizeof(x),SEEK_CUR); fwrite(&x, sizeof(x), 1, fBIN); } fclose(fBIN); Kết quả: cập nhật phần tử Lưu ý: Thao tác đọc ghi không liền nhau, cần phải có fseek rewind giữa. 14 2.1. Các khái niệm Xác định vị trí tại: long nPos = ftell(f); Đưa trỏ đầu file: rewind(f); hoặc: fseek(f, 0, SEEK_SET); Đưa trỏ cuối file: fseek(f, 0, SEEK_END); Đưa trỏ lùi lại phần tử: fseek(f, - sizeof(item), SEEK_CUR); Đưa trỏ tiến đến n vị trí kể từ vị trí hành: fseek(f, n*sizeof(item), SEEK_CUR); Xác định kích thước file: fseek(f, 0, SEEK_END); long nSize = ftell(f); 15 2.2. File có cấu trúc File văn có cấu trúc: Độ bảo mật tốc độ xử lý chậm File nhị phân có cấu trúc: Dữ liệu tổ chức thành record chiếm hầu hết dung lượng file. File có cấu trúc đơn giản char filename[ ] = “INT.BIN”; FILE * f = fopen(filename, “wb”); for(int i = 0; i < N; i++) fwrite(&i, sizeof(int), 1, f); fclose(f); 16 2.2. File có cấu trúc File có cấu trúc phức tạp struct SINHVIEN { char MaSV[11]; char HoTen[41]; char Ngaysinh[10]; float DiemTB; } char filename[ ] = “SV.BIN”; FILE * fSV = fopen(“filename, “wb”); while(1) { //Nhập thông tin sinh viên sv …. fwrite(&sv, sizeof(sv), 1, fSV); } fclose(fSV); 17 2.2. File có cấu trúc File có phần header Bao gồm hai phần: Phần header Phần Data. char filename[ ] = “header.BIN”; FILE * f = fopen(filename, “wb”); char header[ ] = “www”; fwrite(header, sizeof(header), 1, f); for(int i = 0; i < N; i++) fwrite(&i, sizeof(int), 1, f); fclose(f); 18 2.2. File có cấu trúc Hàm feof(…); không trả TRUE truy xuất phần tử sau cùng. //Kết sai FILE* f = fopen(filename, “rb”); while(!feof(f)) { fread(&item, sizeof(item), 1, f); printf(“%d\t”, item); } fclose(f); 19 2.2. File có cấu trúc Hàm feof(…); không trả TRUE truy xuất phần tử sau cùng. //Kết while(fread(&item, sizeof(item), 1, f)) printf(“%d\t”, item); fclose(f); while(!feof(f)) { n = fread(&item, sizeof(item), 1, f); if(n>0) printf(“%d\t”, item); } fclose(f); 20 2.2. File có cấu trúc Hàm fseek(…); không xác vài trường hợp. //Kết sai fread(&item, sizeof(item), 1, f); item++; fseek(f, -sizeof(item), SEEK_CUR); fwrite(&item, sizeof(item), 1, f); //Kết fread(&item, sizeof(item), 1, f); item++; int n = - sizeof(item); fseek(f, n, SEEK_CUR); fwrite(&item, sizeof(item), 1, f); 21 2.3. Thuật toán Merge-Sort Input: f0 tập tin cần thứ tự. Output: f0 tập tin thứ tự. f1, f2 tập tin trộn. f0, f1, f2 tập tin văn (text file) tập tin nhị phân. 22 2.3. Thuật toán Merge-Sort f0: 24 12 67 33 58 42 11 34 29 31 Bước 1: Khởi tạo f1, f2 rỗng Phân bố m=1 phần tử từ f0 vào f1 f2: f1: 24 67 58 11 29 f2: 12 33 42 34 31 Trộn f1, f2 thành f0: f0: 12 24 33 67 42 58 11 34 29 31 23 2.3. Thuật toán Merge-Sort Bước 2: Phân bố m=2 phần tử từ f0 vào f1 f2: f1: 12 24 42 58 29 31 f0: 12 24 33 67 42 58 11 34 29 31 f2: 33 67 11 34 Trộn f1, f2 thành f0: f1: 12 24 42 58 29 31 f0: 12 24 33 67 11 34 42 58 29 31 f2: 33 67 11 34 24 2.3. Thuật toán Merge-Sort Bước 3: Phân bố m=4 phần tử từ f0 vào f1 f2: f1: 12 24 33 67 29 31 f2: 11 34 42 58 Trộn f1, f2 thành f0: f0: 11 12 24 33 34 42 58 67 29 31 25 2.3. Thuật toán Merge-Sort Bước 4: Phân bố m=8 phần tử từ f0 vào f1 f2: f1: 11 12 24 33 34 42 58 67 f2: 29 31 Trộn f1, f2 thành f0: f0: 11 12 24 29 31 33 34 42 58 67 Bước 5: Lặp lại tương tự bước trên, chiều dài m run cần phân bổ lớn chiều dài n f0 dừng. 26 27 [...]... chậm File nhị phân có cấu trúc: Dữ liệu tổ chức thành các record và chiếm hầu hết dung lượng của file File có cấu trúc đơn giản char filename[ ] = “INT.BIN”; FILE * f = fopen(filename, “wb”); for(int i = 0; i < N; i++) fwrite(&i, sizeof(int), 1, f); fclose(f); 16 2.2 File có cấu trúc File có cấu trúc phức tạp struct SINHVIEN { char MaSV[11]; char HoTen[41]; char Ngaysinh[10]; float DiemTB; } char filename[... file: rewind(f); hoặc: fseek(f, 0, SEEK_SET); Đưa con trỏ về cuối file: fseek(f, 0, SEEK_END); Đưa con trỏ lùi lại một phần tử: fseek(f, - sizeof(item), SEEK_CUR); Đưa con trỏ tiến đến n vị trí kể từ vị trí hiện hành: fseek(f, n*sizeof(item), SEEK_CUR); Xác định kích thước file: fseek(f, 0, SEEK_END); long nSize = ftell(f); 15 2.2 File có cấu trúc File văn bản có cấu trúc: Độ bảo mật và tốc độ xử lý. .. HoTen[41]; char Ngaysinh[10]; float DiemTB; } char filename[ ] = “SV.BIN”; FILE * fSV = fopen(“filename, “wb”); while(1) { //Nhập thông tin của sinh viên sv … fwrite(&sv, sizeof(sv), 1, fSV); } fclose(fSV); 17 2.2 File có cấu trúc File có phần header Bao gồm hai phần: Phần header và Phần Data char filename[ ] = “header.BIN”; FILE * f = fopen(filename, “wb”); char header[ ] = “www”; fwrite(header, sizeof(header),...2.1 Các khái niệm cơ bản Cập nhật phần tử thứ i trong file nhị phân fseek(f, i*sizeof(item),SEEK_SET); fread(&item, sizeof(item), 1, f); item++; fseek(f, -sizeof(item), SEEK_CUR); fwrite(&item, sizeof(item), 1, f); 11 2.1 Các khái niệm cơ bản Ghi phần tử lên file nhị phân FILE *fBIN; fBIN = fopen(“filename”, “wb”); fputc(‘A’, fBIN); fputc(26, fBIN); fputc(10, fBIN); fputc(‘B’,... fputc(10, fBIN); fputc(‘B’, fBIN); Kết quả: 65 26 10 66 (4 byte) 12 2.1 Các khái niệm cơ bản Đọc dữ liệu file nhị phân fBIN = fopen(“filename”, “rb”); char c; while(!eof(fBIN)){ c = fgetc(fBIN); printf(“%c”,c); } Kết quả: A 26 10 B 13 2.1 Các khái niệm cơ bản Lỗi Update FILE* fBIN fBIN = fopen(“filename”, “r+b”); while(fread(&x, sizeof(x), 1, fBIN)) if(x == 0) { x++; fseek(fBIN, -sizeof(x),SEEK_CUR);... sizeof(header), 1, f); for(int i = 0; i < N; i++) fwrite(&i, sizeof(int), 1, f); fclose(f); 18 2.2 File có cấu trúc Hàm feof(…); không trả về TRUE khi truy xuất phần tử sau cùng //Kết quả sai FILE* f = fopen(filename, “rb”); while(!feof(f)) { fread(&item, sizeof(item), 1, f); printf(“%d\t”, item); } fclose(f); 19 2.2 File có cấu trúc Hàm feof(…); không trả về TRUE khi truy xuất phần tử sau cùng //Kết quả đúng... while(fread(&item, sizeof(item), 1, f)) printf(“%d\t”, item); fclose(f); while(!feof(f)) { n = fread(&item, sizeof(item), 1, f); if(n>0) printf(“%d\t”, item); } fclose(f); 20 2.2 File có cấu trúc Hàm fseek(…); không chính xác trong một vài trường hợp //Kết quả sai fread(&item, sizeof(item), 1, f); item++; fseek(f, -sizeof(item), SEEK_CUR); fwrite(&item, sizeof(item), 1, f); //Kết quả đúng fread(&item,... fwrite(&item, sizeof(item), 1, f); 21 2.3 Thuật toán Merge-Sort Input: f0 là tập tin cần sắp thứ tự Output: f0 là tập tin đã được sắp thứ tự f1, f2 là 2 tập tin trộn f0, f1, f2 có thể là các tập tin văn bản (text file) hoặc có thể là các tập tin nhị phân 22 2.3 Thuật toán Merge-Sort f0: 24 12 67 33 58 42 11 34 29 31 Bước 1: Khởi tạo f1, f2 rỗng Phân bố m=1 phần tử lần lượt từ f0 vào f1 và f2: f1: 24 67 58 11 29 . FileFile FileFile 2.1. Các khái niệm cơ bản CHƯƠNG TRÌNH Hệ điều hành Tên file, chỉ thị đọc ghi Con trỏ file (file ID) 2 Thiết bị lưu trữ 2.1. Các khái. record và chiếm hầu hết dung lượng của file.  File có cấu trúc đơn giản 16  File có cấu trúc đơn giản char filename[ ] = “INT.BIN”; FILE * f = fopen(filename, “wb”); for(int i = 0; i < N;. f); fclose(f); 2.2. File có cấu trúc File có cấu trúc phức tạp struct SINHVIEN { char MaSV[11]; char HoTen [41 ]; char Ngaysinh[10]; float DiemTB; } 17 } char filename[ ] = “SV.BIN”; FILE * fSV = fopen(“filename,

Ngày đăng: 11/09/2015, 14:19

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan