Bài giảng Lập trình nâng cao - Bài 13+14+15: Vào ra dữ liệu với tập tin - Trương Xuân Nam

pdf 25 trang Gia Huy 17/05/2022 1861
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình nâng cao - Bài 13+14+15: Vào ra dữ liệu với tập tin - Trương Xuân Nam", để 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_lap_trinh_nang_cao_bai_131415_vao_ra_du_lieu_voi_t.pdf

Nội dung text: Bài giảng Lập trình nâng cao - Bài 13+14+15: Vào ra dữ liệu với tập tin - Trương Xuân Nam

  1. LẬP TRÌNH NÂNG CAO Bài 13+14+15: vào ra dữ liệu với tập tin TRƯƠNG XUÂN NAM 1
  2. Nội dung 1. Tập tin văn bản và tập tin nhị phân 2. Làm việc với tập tin văn bản 3. Làm việc với tập tin nhị phân 4. Bài tập Trương Xuân Nam - Khoa CNTT 2
  3. Phần 1 Tập tin văn bản và tập tin nhị phân TRƯƠNG XUÂN NAM 3
  4. Làm việc với tập tin TRƯƠNG XUÂN NAM 4
  5. Làm việc với tập tin ▪ Tập tin (file) là thành phần cơ bản của các thiết bị lưu trữ ▪ Đa số các ngôn ngữ lập trình (trong đó có C/C++) chia tập tin làm 2 loại: ▪ Tập tin dạng nhị phân (binary file): có thể xem như dãy các byte, đọc/ghi theo từng byte ▪ Tập tin dạng văn bản (text file): có thể xem như dãy các string, đọc/ghi theo từng dòng ▪ Biến cin, cout thực chất là các tập tin văn bản đặc biệt ▪ cin đại diện cho tập tin đầu vào của chương trình ▪ cout đại diện cho tập tin đầu ra của chương trình ▪ Vì vậy: làm việc với file văn bản cũng tương tự làm việc với cin, cout Trương Xuân Nam - Khoa CNTT 5
  6. Tập tin văn bản ▪ Dãy các dòng kế tiếp nhau ▪ Độ dài các dòng không nhất thiết phải giống nhau ▪ Mỗi dòng kết thúc bằng ký hiệu cuối dòng (end_of_line) hoặc ký hiệu cuối tập tin (end_of_file) – nếu là dòng cuối cùng trong file ▪ Dòng không phải là một chuỗi: chuỗi kết thúc bởi ký tự \0 ▪ Khi ghi ký hiệu xuống dòng (\n), hệ thống tự động chuyển thành cặp ký tự CR-LF (về đầu dòng và xuống dòng) trên Windows và thành cặp LF-CR trên Linux/Unix ▪ Khi đọc thì cặp CR-LF hoặc LF-CR được tự động chuyển thành ký hiệu xuống dòng (\n) Tập tin
  7. Tập tin văn bản TRƯƠNG XUÂN NAM 7
  8. Tập tin nhị phân ▪ Tập tin nhị phân không phân thành các dòng, mà dữ liệu được xem như một dãy byte nằm liên tục ▪ Các ký hiệu \n, \0 hoặc các ký tự đặc biệt được coi như các byte dữ liệu thông thường ▪ Dữ liệu trong tập tin nhị phân phản ảnh chính xác cách bố trí dữ liệu trong bộ nhớ ▪ Một số nguyên trong bộ nhớ cỡ 4 byte thì khi ghi xuống tập tin nhị phân cũng sẽ chính xác là 4 byte có nội dung giống hệt như trong bộ nhớ ▪ Muốn đọc/ghi dữ liệu nhị phân đúng cách cần phải biết chính xác cách bố trí dữ liệu trong tập tin ▪ Một số thậm chí được ghi thành tài liệu kĩ thuật Tập tin
  9. Tập tin nhị phân TRƯƠNG XUÂN NAM 9
  10. Quy tắc làm việc với tập tin ▪ Làm việc với tập tin gồm 2 loại: ▪ Thao tác tập tin (tạo, xóa, sao chép, thay đổi thuộc tính, ) ▪ Thao tác nội dung tập tin (đọc, ghi, xóa, sửa, ) ▪ Các thao tác tập tin sử dụng các hàm trong thư viện , đây là thư viện cung cấp các hàm cấp thấp làm việc với hệ thống file, tương thích với các mã nguồn cũ ▪ Thao tác nội dung tập tin (dù là loại gì), đều theo 3 bước: 1. Mở tập tin 2. Thao tác nội dung 3. Đóng tập tin ▪ Bước mở tập tin sẽ yêu cầu OS chuẩn bị cho thao tác file ▪ Bước đóng tập tin sẽ thực sự cập nhật hệ thống file TRƯƠNG XUÂN NAM 10
  11. Phần 2 Làm việc với tập tin văn bản Trương Xuân Nam - Khoa CNTT 11
  12. Ghi chuỗi ra tập tin văn bản #include #include using namespace std; int main() { // khai báo biến có kiểu tập tin văn bản để ghi ra ofstream myfile; // mở tập tin có tên là "example.txt" myfile.open("example.txt"); // ghi 100 dòng vào tập tin for (int i = 0; i < 100; i++) myfile << "Dong thu " << i << endl; // đóng tập tin lại myfile.close(); } TRƯƠNG XUÂN NAM 12
  13. Đọc chuỗi từ tập tin văn bản int main() { string line; // khai báo biến có kiểu tập tin văn bản để đọc vào ifstream myfile; // mở tập tin có tên là "example.txt" myfile.open("example.txt"); // đọc hết các dòng của tập tin và in ra while (!myfile.eof()) { getline(myfile, line); cout << line << endl; } // đóng tập tin lại myfile.close(); } TRƯƠNG XUÂN NAM 13
  14. Thư viện làm việc với file ▪ C++ cung cấp các thư viện sau để làm việc với file ▪ ofstream: để ghi dữ liệu trên file ▪ ifstream: để đọc dữ liệu trên file ▪ fstream: để đọc và ghi dữ liệu trên file ▪ Cơ chế làm việc của C++ với file là “luồng” (stream) ▪ Cách xây dựng thư viện có thể gây bối rối bởi vì có nhiều cách mở tập tin ifstream input("input_file.txt"); ofstream output("output_file.txt"); ▪ Hoặc: fstream input("input_file.txt", istream::in); fstream output("output_file.txt", ostream::out); ▪ Hai cách đều tạo các biến giúp đọc ghi tập tin TRƯƠNG XUÂN NAM 14
  15. Mở / đóng file ▪ Thay vì mở file ngay khi khai báo biến, có thể mở sau đó ▪ Hàm: open(filename, mode); ▪ Trong đó các chế độ (mode) mở file có thể là: ios::in Mở file để ghi ios::out Mở file để đọc ios::binary Mở file chế độ nhị phân (binary) Thiết lập vị trí ban đầu ở cuối file, nếu không có cờ này ios::ate thì vị trí ban đầu ở đầu file ios::app Nội dung ghi vào tệp sẽ được thêm vào cuối tệp Nếu file đã tồn tại thì nội dung trong file sẽ được ghi ios::trunc đè bằng nội dung mới TRƯƠNG XUÂN NAM 15
  16. Mở / đóng file ▪ Có thể kết hợp nhiều chế độ cùng một lúc f.open("abc.txt", ios::out | ios::app | ios::binary); ▪ Các biến loại ofstream, ifstream và fstream có các chế độ mặc định khác nhau, trong trường hợp ta không cung cấp tham số mode ofstream ios::out ifstream ios::in fstream ios::in | ios::out ▪ Đôi khi hàm mở file không thành công, ta có thể kiểm tra lại bằng hàm is_open if (myfile.is_open()) { ▪ Đóng tập tin: myfile.close(); TRƯƠNG XUÂN NAM 16
  17. Đọc / ghi file văn bản ▪ Cách thức đọc dữ liệu an toàn nhất là sử dụng getline while (getline(myfile, line)) ▪ Tương tự như đọc chuỗi, có thể dùng thao tác tương tự cin ▪ Cách thức ghi dữ liệu tương tự như ghi ra cout ▪ Kiểm tra trạng thái luồng trong quá trình xử lý ▪ bad() trả về true nếu đọc / ghi lỗi, ví dụ khi chúng ta ghi dữ liệu vào file chưa được mở ▪ fail() trả về true tương tự như bad(), ngoài ra chúng còn trả về true trong trường hợp lỗi định dạng, chẳng hạn như cố gắng đọc một số nguyên nhưng giá trị không phù hợp ▪ eof() trả về true nếu đã đến cuối file ▪ good() trả về true khi mọi việc hoàn hảo, tức là mọi thao tác tập tin trước đó đều hoạt động tốt TRƯƠNG XUÂN NAM 17
  18. Phần 3 Làm việc với tập tin nhị phân TRƯƠNG XUÂN NAM 18
  19. Đọc ghi tập tin nhị phân ▪ C++ cung cấp hai hai hàm đọc ghi dữ liệu theo khối, sử dụng riêng cho tập tin nhị phân write(memory_block, size); read(memory_block, size); ▪ Tham số memory_block là một con trỏ kiểu char * là địa chỉ mảng byte lưu trữ các dữ liệu cần ghi hoặc đọc ▪ Tham số size là số byte sẽ được đọc hoặc ghi TRƯƠNG XUÂN NAM 19
  20. Ghi dữ liệu vào tập tin nhị phân struct Person { char name[50]; int age; char phone[24]; }; int main() { Person me = { "txnam", 18, "091.210.2165" }; Person friends[5000]; ofstream outfile; outfile.open("fb.data", ios::binary | ios::out); outfile.write(&me, sizeof(me)); outfile.write(book, 5000 * sizeof(Person)); outfile.close(); } TRƯƠNG XUÂN NAM 20
  21. Vị trí con trỏ file ▪ Con trỏ file là vị trí mà đầu đọc / ghi dữ liệu của hệ thống hiện tại đang trỏ tới, khi phát lệnh đọc (hoặc ghi) dữ liệu, đầu đọc sẽ thực hiện ở vị trí hiện tại và dịch chuyển tới vị trí ngay sau đó ▪ Giống con trỏ trên màn hình console ▪ Con trỏ file tồn tại trong cả file văn bản và file nhị phân, nhưng chúng thường được dùng với file nhị phân, do nhu cầu đọc dữ liệu ngẫu nhiên ▪ Một số luồng không thể đọc chính xác vị trí đầu đọc ▪ Hai hàm cho phép lấy vị trí hiện tại của con trỏ file: ▪ Hàm tellg() trả về vị trí đầu đọc ▪ Hàm tellp() trả về vị trí đầu ghi TRƯƠNG XUÂN NAM 21
  22. Vị trí con trỏ file ▪ Hai hàm cho phép dịch chuyển các đầu đọc này: ▪ seekg(position, direction); ▪ seekp(position, direction); ▪ Tham số position là vị trí dịch chuyển tới, tính theo đơn vị byte ▪ Tham số direction quy định cách thức tính vị trí mới, nếu không có tham số này thì mặc định tính từ đầu tập tin ios::beg Vị trí mới được tính từ vị trí bắt đầu tập tin ios::cur Vị trí mới được tính từ vị trí hiện tại của con trỏ ios::end Vị trí mới được tính từ vị trí cuối tệp tin TRƯƠNG XUÂN NAM 22
  23. Phần 4 Bài tập TRƯƠNG XUÂN NAM 23
  24. Bài tập ▪ ▪ TRƯƠNG XUÂN NAM 24
  25. Bài tập TRƯƠNG XUÂN NAM 25