Bài giảng Lập trình hướng đối tượng - Chương 8: Ghi/đọc dữ liệu của ứng dụng C# ra file - Đại học Bách khoa TP.HCM

pdf 27 trang ngocly 2350
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 8: Ghi/đọc dữ liệu của ứng dụng C# ra file - Đại học Bách khoa TP.HCM", để 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_huong_doi_tuong_chuong_8_ghioc_du_lieu_c.pdf

Nội dung text: Bài giảng Lập trình hướng đối tượng - Chương 8: Ghi/đọc dữ liệu của ứng dụng C# ra file - Đại học Bách khoa TP.HCM

  1. Chương 8 Ghi/₫ọc dữ liệu của ứng dụng C# ra file 8.0 Dẫn nhập 8.1 Tổng quát về ₫ời sống của dữ liệu của ứng dụng VC# 8.2 Các cấp ₫ộ ghi/₫ọc dữ liệu phổ biến 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng 8.9 Kết chương Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 1 8.0 Dẫn nhập ‰ Chương này giới thiệu các ₫ối tượng phục vụ ghi/₫ọc dữ liệu ra/vào file cùng các tác vụ ghi/₫ọc dữ liệu cổ ₫iển ra/vào file. ‰ Chương này cũng giới thiệu các ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file cùng các tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 2
  2. 8.1 Tổng quát về ₫ời sống của dữ liệu ⊂ ứng dụng VC# ‰ Nhu cầu ghi/₫ọc nội dung của các biến dữ liệu thường rơi vào 3 tình huống chính yếu sau ₫ây : 1. Lưu kết quả của phiên làm việc hiện hành ₫ể dùng lại cho phiên làm việc kế tiếp. 2. Nhập rất nhiều dữ liệu cho phần mềm. 3. Xuất rất nhiều dữ liệu cho người dùng. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 3 8.2 Các cấp ₫ộ ghi/₫ọc dữ liệu phổ biến 1. ghi/₫ọc chuỗi byte thô ra/từ file, ngữ nghĩa của các byte do chương trình tự qui ₫ịnh. 2. ghi/₫ọc chuỗi ký tự theo cách mã hóa xác ₫ịnh (ASCII, UTF8, UCS-2, ) ra/từ file. 3. ghi/₫ọc các dữ liệu thuộc các kiểu cơ bản ₫ịnh sẵn như bool, byte, int, double, String, ra/từ file theo dạng nhị phân, là dạng mã hóa gốc bên trong chương trình. 4. giải mã các dữ liệu thuộc các kiểu cơ bản ₫ịnh sẵn như bool, byte, int, double, String, thành chuỗi văn bản, ghi chuỗi ra file văn bản ₫ể khi cần ₫ọc các chuỗi văn bản từ file vào chương trình, mã hóa từng chuỗi trên file thành dữ liệu nhị phân bên trong chương trình trước khi xử lý tiếp. 5.ghi/₫ọc ₫ối tượng và các ₫ối tượng ₫ược tham khảo trực tiếp hay gián tiếp bởi ₫ối tượng gốc ra/từ file nhị phân hay file XML. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 4
  3. 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ class sử dụng : FileStream ‰ các tác vụ : WriteByte(), ReadByte() ‰ Qui trình ghi ₫iển hình như sau : //1. tạo ₫ối tượng quản lý file ₫ể ghi dữ liệu FileStream oFile = new FileStream("C:\\data.bin", FileMode.Create); //2. ghi tuần tự từng byte ra file oFile.WriteByte(1byte); //3. ₫óng file lại ₫ể phòng ngừa việc ghi bất hợp pháp lên file oFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 5 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ Code thí dụ việc ghi chuỗi byte : Bitmap bmScreen; //₫ịnh nghĩa biến chứa ảnh bitmap Graphics gpScreen; //₫ịnh nghĩa biến chứa các tác vụ xử lý nội dung ₫ối tượng giao diện this.Hide(); //nếu cần, ẩn Form hiện hành ₫ể không xuất hiện trong bitmap chụp //tạo ₫ối tượng bitmap cùng kích thước màn hình bmScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); //tạo ₫ối tượng Graphics kết hợp với bmScreen gpScreen = Graphics.FromImage(bmScreen); //chụp toàn màn hình và lưu vào bmScreen gpScreen.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 6
  4. 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ Code thí dụ việc ghi chuỗi byte : //hiển thị lại Form hiện hành nếu cần this.Show(); //chuyển bitmap thành dãy các byte liên tục ImageConverter imgConverter = new ImageConverter(); byte[] xByte = (byte[])imgConverter.ConvertTo(bmScreen, typeof(byte[])); //1. tạo file ₫ể lưu trữ dãy các byte nội dung của bitmap FileStream oFile = new FileStream("d:\\screen.bin", FileMode.Create); //2. lặp ghi từng byte của dãy xByte ra file for (int i = 0; i < xByte.Length; i++) oFile.WriteByte(xByte[i]); //3. ₫óng file lại oFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 7 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ Qui trình ₫ọc chuỗi byte ₫iển hình như sau : //1. tạo ₫ối tượng quản lý file ₫ể ₫ọc dữ liệu FileStream inFile = new FileStream("C:\\data.bin", FileMode.Open); //2. ₫ọc tuần tự từng byte từ file inFile.ReadByte(1byte); //3. ₫óng file lại ₫ể phòng ngừa việc ₫ọc bất hợp pháp lên file inFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 8
  5. 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ Code thí dụ việc ₫ọc chuỗi byte : //1. mở file chứa dữ liệu cần ₫ọc FileStream inFile = new FileStream("d:\\screen.bin", FileMode.Open); //tạo biến dãy các byte với ₫ộ lớn bằng ₫ộ lớn của file byte[] xData = new byte[inFile.Length]; //2. lặp ₫ọc từng byte từ file vào dãy xData for (int i = 0; i < inFile.Length; i++) xData[i] = (byte)inFile.ReadByte(); //3. ₫óng file lại inFile.Close(); //tạo ₫ối tượng Stream MemoryStream ms = new MemoryStream(xByte, 0, xByte.Length); ms.Position = 0; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 9 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file ‰ Code thí dụ việc ₫ọc chuỗi byte : //copy dãy byte vào ₫ối tượng Stream ms.Write(xData, 0, xData.Length); //biến ₫ổi ₫ối tượng Stream thành ₫ối tượng Image System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true); //hiển thị bitmap lên ₫ối tượng PictureBox của Form ứng dụng picImage.SizeMode = PictureBoxSizeMode.StretchImage; picImage.Image = image; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 10
  6. 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file ‰ class sử dụng : StreamWriter, StreamReader ‰ các tác vụ : Write (), Read () ‰ Qui trình ghi ₫iển hình như sau : //1. tạo ₫ối tượng quản lý file ₫ể ghi dữ liệu StreamWriter oFile = new StreamWriter("d:\\data.txt", false, Encoding.Unicode); //2. ghi tuần tự từng ký tự ra file oFile.Write(buf[i]); //3. ₫óng file lại ₫ể phòng ngừa việc ghi bất hợp pháp lên file oFile.Close(); ‰ Lưu ý ký tự ₫ược ₫ổi từ mã Unicode 2 byte bên trong chương trình ra mã ký tự do file qui ₫ịnh. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 11 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file ‰ Code thí dụ việc ghi chuỗi ký tự : //xử lý và tạo chuỗi văn bản kết quả rồi chứa vào biến ₫ể lưu giữ String buf = "Thí dụ ₫ể xuất ma trận ra file văn bản, ta có thể qui ước các dữ liệu sẽ xuất nhập tuần tự : số hàng, số cột, giá trị các phần tử hàng 1 từ trái sang phải, giá trị các phần tử hàng 2 từ trái sang phải, cuối cùng là giá trị các phần tử hàng cuối của ma trận. Giữa 2 phần tử kề nhau ta xuất thêm 1 hay nhiều dấu ngăn phù hợp như khoảng trắng, dấu phẩy, dấu ₫óng cột, dấu xuống hàng Sau ₫ây là nội dung file văn bản miêu tả ma trận có 5 hàng, 7 cột"; //1. tạo file ₫ể lưu trữ chuỗi ký tự theo cách mã hóa UCS-2 StreamWriter oFile = new StreamWriter("d:\\data.txt", false, Encoding.Unicode); //2. lặp ghi từng ký tự của chuỗi văn bản ra file for (int i = 0; i < buf.Length; i++) oFile.Write(buf[i]); //3. ₫óng file lại oFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 12
  7. 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file ‰ Qui trình ₫ọc chuỗi ký tự ₫iển hình như sau : //1. tạo ₫ối tượng quản lý file ₫ể ₫ọc dữ liệu StreamReader inFile = new StreamReader(fileName, Encoding.Unicode); //2. ₫ọc tuần tự từng ký tự từ file ch = (char)inFile.Read(); //3. ₫óng file lại ₫ể phòng ngừa việc ₫ọc bất hợp pháp lên file inFile.Close(); ‰ Lưu ý sau khi ₫ọc ₫ược ký tự từ file, hàm Read sẽ ₫ổi từ mã gốc trên file sang mã Unicode 2 byte bên trong chương trình. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 13 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file ‰ Code thí dụ việc ₫ọc chuỗi ký tự : //₫ịnh nghĩa biến chứa dãy ký tự ₫ọc từ file vào char[] xchar; //₫ịnh nghĩa biến chứa ₫ường dẫn của file van bản cần ₫ọc String fileName = "d:\\data.txt"; //tạo ₫ối tượng FileInfo kết hợp với file ₫ể lấy các thông tin về file FileInfo fi = new FileInfo(fileName); //1. tạo ₫ối tượng file chứa chuỗi ký tự theo cách mã hóa UCS-2 cần ₫ọc StreamReader inFile = new StreamReader(fileName, Encoding.Unicode); //phân phối vùng nhớ cần thiết cho biến array các ký tự xchar = new char[fi.Length]; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 14
  8. 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file ‰ Code thí dụ việc ₫ọc chuỗi ký tự : //2. lặp ₫ọc từng ký tự từ file vào biến array các ký tự int i = 0; while (!inFile.EndOfStream) xchar[i++] = (char)inFile.Read(); //3. ₫óng file lại inFile.Close(); //₫ổi array ký tự thành dạng chuổi ký tự String buf = new String(xchar); //hiển thị chuỗi kết quả lên TextBox txtOutput.Text = buf; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 15 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ class sử dụng : FileStream, BinaryWriter, BinaryReader ‰ các tác vụ : Write (), ReadBoolean(), , ReadSTring() ‰ Lưu ý : ƒ khi ghi 1 dữ liệu ra file nhị phân, máy sẽ ₫ể nguyên ₫ịnh dạng gốc bên trong rồi ghi ra file (td. giá trị double chiếm 8 byte sẽ ₫ược ghi ra file thành 8 byte) trừ trường hợp dữ liệu chuỗi. Trong trường hợp này máy sẽ giải mã chuỗi từ mã Unicode 2 byte thành mã UTF-8 rồi ghi ra file (có ghi thêm ₫ộ dài chuỗi ₫ể khi ₫ọc lại máy biết chính xác). Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 16
  9. 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Lưu ý : ƒ khi ₫ọc 1 dữ liệu từ file nhị phân vào, máy sẽ ₫ể nguyên ₫ịnh dạng gốc trên file và copy vào bộ nhớ chương trình (td. giá trị double chiếm 8 byte trên file sẽ ₫ược ₫ọc vào thành 8 byte trong biến double) trừ trường hợp dữ liệu chuỗi. Trong trường hợp này máy sẽ mã hóa chuỗi từ mã UTF-8 trên file thành mã Unicode 2 byte của kiểu String trong chương trình. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 17 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Qui trình ghi ₫iển hình như sau : //1. tạo ₫ối tượng quản lý file FileStream stream = new FileStream("C:\\data.bin", FileMode.Create); //2. tạo ₫ối tượng phục vụ ghi file BinaryWriter writer = new BinaryWriter(stream); //3. xử lý dữ liệu theo yêu cầu chương trình int i = -15; double d = -1.5; String s = "Nguyễn Văn Hiệp"; bool b = true; //4. ghi dữ liệu ra file writer.Write(b); writer.Write(i); writer.Write(d); writer.Write(s); //5. ₫óng các ₫ối tượng ₫ược dùng lại writer.Close(); stream.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 18
  10. 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Tác vụ Write của class BinaryWriter có 14 biến thể 1 tham số ₫ể ghi ₫ược 14 kiểu dữ liệu ₫ịnh sẵn phổ biến sau ₫ây : ƒ Boolean ƒ Byte, SByte ƒ Int16, Int32, Int64 ƒ UInt16, UInt32, UInt64 ƒ Single, Double, Decimal ƒ Byte[] , Char[] ƒ Char, String ‰ Muốn ghi nội dung của biến thuộc 1 trong 14 kiểu dữ liệu ₫ịnh sẵn trên, ta gọi tác vụ write theo dạng sau : writer.Write(varname); //writer là biến ₫ối tượng BinaryWriter Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 19 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Tác vụ Write của class BinaryWriter còn có 2 biến thể 3 tham số ₫ể ghi ₫ược các phần tử chọn lọn trong danh sách : //ghi count byte từ vị trí index trong danh sách buffer BinaryWriter.Write(Byte[] buffer, int index, int count); //ghi count ký tự từ vị trí index trong danh sách buffer BinaryWriter.Write(Char[] buffer, int index, int count); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 20
  11. 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Qui trình ₫iển hình ₫ể ₫ọc dữ liệu từ file nhị phân vào : //1. tạo ₫ối tượng quản lý file FileStream stream = new FileStream("C:\\data.bin", FileMode.Open); //2. tạo ₫ối tượng phục vụ ₫ọc file BinaryReader reader = new BinaryReader(stream); //3. ₫ịnh nghĩa các biến dữ liệu theo yêu cầu chương trình int i; double d; String s; bool b; //4. ₫ọc dữ liệu từ file vào các biến b= reader.ReadBoolean(); //₫ọc trị luận lý i = reader.ReadInt32(); //₫ọc số nguyên 32 bit d = reader.ReadDouble(); //₫ọc số thực chính xác kép s = reader.ReadString(); //₫ọc chuỗi //5. ₫óng các ₫ối tượng ₫ược dùng lại reader.Close(); stream.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 21 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Class BinaryReader cung cấp 14 tác vụ khác nhau ₫ể ₫ọc dữ liệu nhị phân vào biến thuộc 14 kiểu dữ liệu ₫ịnh sẵn của VC# : ƒ ReadBoolean ƒ ReadByte, ReadSByte ƒ ReadChar ƒ ReadInt16, ReadInt32, ReadInt64 ƒ ReadUInt16, ReadUInt32, ReadUInt64 ƒ ReadSingle, ReadDouble, ReadDecimal ƒ ReadString Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 22
  12. 8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân ‰ Class BinaryReader còn cung cấp thêm 2 tác vụ khác ₫ể ₫ọc vào array các byte hay array các ký tự : //₫ọc count byte từ file vào biến array các byte byte[] dsbyte = BinaryReader.ReadBytes(int count); //₫ọc count ký tự từ file vào biến array các ký tự Char[] dschar = BinaryReader.ReadChars(int count); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 23 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ Mặc dù việc ghi/₫ọc dữ liệu ra file ở dạng nhị phân (y như trong máy) là rất ₫ơn giản, hiệu quả (khỏi phải thực hiện mã hóa/giải mã dữ liệu). Tuy nhiên, file nhị phân cũng có 1 số nhược ₫iểm : ƒ người dùng khó xem, khó kiểm tra nội dung của file. ƒ người dùng khó tạo dữ liệu dưới dạng nhị phân ₫ể chương trình ₫ọc vào xử lý. ‰ Trong trường hợp cần nhập nhiều thông tin cho chương trình, ta không thể dùng các ₫ối tượng giao diện như textbox, listbox. Trong trường hợp này, ta sẽ dùng trình soạn thảo văn bản ₫ể soạn dữ liệu dưới dạng văn bản hầu xem/kiểm tra/sửa chữa dễ dàng. File văn bản chứa dữ liệu là danh sách gồm nhiều chuỗi, mỗi chuỗi miêu tả 1 dữ liệu (luận lý, số nguyên, số thực, chuỗi, ), các chuỗi sẽ ₫ược ngăn cách nhau bởi 1 hay nhiều dấu ngăn. Dấu ngăn thường dùng là ký tự gióng cột TAB, ký tự xuống hàng. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 24
  13. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ class sử dụng : StreamWriter ‰ các tác vụ : Write () ‰ Lưu ý : ƒ .Net chỉ cung cấp class StreamWriter ₫ể phục vụ chiều ghi dữ liệu từ phần mềm ra file văn bản, chứ không cung cấp class phục vụ chiều ₫ọc dữ liệu từ file văn bản vào phần mềm. ƒ khi ghi 1 dữ liệu ra file văn bản, máy sẽ giải mã dữ liệu từ ₫ịnh dạng nhị phân bên trong ra dạng chuỗi (theo mã qui ₫ịnh bởi file). ƒ khi ₫ọc 1 dữ liệu từ file văn bản, máy sẽ mã hóa dữ liệu từ ₫ịnh dạng chuỗi văn bản trên file thạnh dạng nhị phân bên trong chương trình. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 25 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ Qui trình ₫iển hình ₫ể ghi dữ liệu trong chương trình ra file ở dạng text (giãi mã dữ liệu nhị phân thành dạng chuỗi) : //1. tạo ₫ối tượng quản lý file FileStream stream = new FileStream("C:\\data.txt", FileMode.Create); //2. tạo ₫ối tượng phục vụ ghi file StreamWriter writer = new StreamWriter(stream, Encoding.Unicode); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 26
  14. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //3. xử lý dữ liệu theo yêu cầu chương trình int i = -15; double d = -1.5; String s = "Nguyễn Văn Hiệp"; bool b = true; //4. ghi dữ liệu ra file writer.Write(b); writer.Write("\t"); //ghi 1 dữ liệu và dấu ngăn writer.Write(i); writer.WriteLine(); //ghi 1 dữ liệu và dấu ngăn writer.Write(d); writer.Write("\t"); //ghi 1 dữ liệu và dấu ngăn writer.Write(s); writer.Write("\t"); //ghi 1 dữ liệu và dấu ngăn //5. ₫óng các ₫ối tượng ₫ược dùng lại writer.Close(); stream.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 27 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ Qui trình ₫iển hình ₫ể ₫ọc dữ liệu từ file text vào chương trình (mã hóa dữ liệu từ chuỗi thành dữ liệu nhị phân) : //1. tạo ₫ối tượng quản lý file FileStream stream = new FileStream("C:\\data.txt", FileMode.Open); //2. tạo ₫ối tượng phục vụ ₫ọc file StreamReader reader=new StreamReader(stream,Encoding.Unicode); //3. ₫ịnh nghĩa các biến dữ liệu theo yêu cầu chương trình int i; double d; String s; bool b; String buf=null; //4. ₫ọc dữ liệu từ file vào các biến ReadItem(reader,ref buf); b = Boolean.Parse(buf); //₫ọc trị luận lý ReadItem(reader,ref buf); i = Int32.Parse(buf); //₫ọc số nguyên 32 bit ReadItem(reader,ref buf); d = Double.Parse(buf); //₫ọc số thực ReadItem(reader,ref buf); s = buf; //₫ọc chuỗi //5. ₫óng các ₫ối tượng ₫ược dùng lại reader.Close(); stream.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 28
  15. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //hàm ₫ọc chuỗi miêu tả 1 dữ liệu nào ₫ó static void ReadItem(StreamReader reader, ref String buf) { char ch; //thiết lập chuỗi nhập ₫ược lúc ₫ầu là rỗng buf = ""; //lặp cho ₫ến khi hết file while (reader.EndOfStream != true) { ch = (char)reader.Read(); //₫ọc 1 ký tự if (ch != '\t' && ch != '\r' && ch!='\n') //nếu là ký tự bình thường buf += ch.ToString(); else { //nếu là dấu ngăn thì kết thúc việc ₫ọc chuỗi if (ch == '\r') reader.Read(); //₫ọc bỏ luôn ký tự '\n' return; //trả kết quả về nơi gọi } } } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 29 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ Để giúp người lập trình dễ dàng viết code ₫ọc dữ liệu chuỗi vào các biến thuộc các kiểu ₫ịnh sẵn, ta ₫ịnh nghĩa 1 class mới có tên là DataScanner, class này chứa các tác vụ ₫ọc dữ liệu như sau : ƒ ReadBoolean ƒ ReadByte, ReadSByte ƒ ReadChar ƒ ReadInt16, ReadInt32, ReadInt64 ƒ ReadUInt16, ReadUInt32, ReadUInt64 ƒ ReadSingle, ReadDouble, ReadDecimal ƒ ReadString ‰ Class DataScanner sẽ dùng dịch vụ ₫ọc chuỗi ký tự thô của class StreamReader như sau : Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 30
  16. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản class DataScanner { StreamReader reader; //₫ối tượng phục vụ ₫ọc chuỗi ký tự thô String sdel; //chứa các ký tự dấu ngăn giữa các chuỗi dữ liệu //tác vụ khởi tạo public DataScanner(String fname, Encoding enc) { //tạo ₫ối tượng phục vụ ₫ọc file reader = new StreamReader(fname, enc); } //tác vụ dọn dẹp ~DataScanner() { //₫óng ₫ối tượng phục vụ ₫ọc file reader.Close(); } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 31 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //tác vụ ₫óng ₫ối tượng public void Close() { //₫óng ₫ối tượng phục vụ ₫ọc file reader.Close(); } //tác vụ thiết lập chuỗi các dấu ngăn ₫ược dùng trong file public void useDelimiter(String s) { sdel = s; } //tác vụ kiểm tra ký tự có phải là dấu ngăn ₫ược dùng trong file không public bool isDelimiter(char ch) { for (int i = 0; i < sdel.Length; i++) if (sdel[i] == ch) return true; return false; } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 32
  17. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //hàm ₫ọc chuỗi hiện hành miêu tả 1 dữ liệu nào ₫ó private String ReadItem() { String buf = ""; //thiết lập chuỗi nhập ₫ược lúc ₫ầu là rỗng char ch = '\0'; while (reader.EndOfStream != true) {//lặp ₫ọc bỏ các dấu ngăn ch = (char)reader.Read(); //₫ọc 1 ký tự if (!isDelimiter(ch)) break; //nếu là ký tự bình thường thì dừng } buf += ch.ToString(); //lặp ₫ọc các ký tự của chuỗi dữ liệu while (reader.EndOfStream != true) { ch = (char)reader.Read(); //₫ọc 1 ký tự if (isDelimiter(ch)) return buf; //nếu là dấu ngăn thì dừng buf += ch.ToString(); //chứa ký tự vào bộ ₫ệm } return buf; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Tr} ường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 33 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //tác vụ ₫ọc giá trị luận lý public bool nextBoolean() { String buf; try { buf = ReadItem(); return Boolean.Parse(buf); } catch (Exception e) { throw new Exception("Không ₫ọc ₫ược số nguyên cho bạn"); } } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 34
  18. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //tác vụ ₫ọc số kiểu int public int nextInt() { String buf; try { buf = ReadItem(); return Int32.Parse(buf); } catch (Exception e) { throw new Exception("Không ₫ọc ₫ược số nguyên cho bạn"); } } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 35 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //tác vụ ₫ọc số kiểu double public double nextDouble() { String buf; try { buf = ReadItem(); return Double.Parse(buf); } catch (Exception e) { throw new Exception("Không ₫ọc ₫ược số thực double cho bạn"); } } //₫ịnh nghĩa các tác vụ khác ₫ể ₫ọc dữ liệu kiểu khác nếu muốn // Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 36
  19. 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản //tác vụ ₫ọc chuỗi public String nextString() { try { return ReadItem(); } catch (Exception e) { throw new Exception("Không ₫ọc ₫ược chuỗi văn bản cho bạn"); } } } //hết class DataScanner Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 37 8.6 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file văn bản ‰ Qui trình ₫iển hình ₫ể ₫ọc dữ liệu từ file text vào chương trình dùng class DataScanner : //1. tạo ₫ối tượng phục vụ ₫ọc file văn bản DataScanner dscan = new DataScanner("d:\\data.txt", Encoding.Unicode); dscan.useDelimiter("\t\r\n"); //khai báo các dấu ngăn //2. ₫ịnh nghĩa các biến dữ liệu theo yêu cầu chương trình int i; double d; String s; bool b; String buf=null; //3. ₫ọc dữ liệu từ file vào các biến b = dscan.nextBoolean(); //₫ọc trị luận lý i = dscan.nextInt(); //₫ọc số nguyên 32 bit d = dscan.nextDouble(); //₫ọc số thực s = dscan.nextString(); //₫ọc chuỗi //4. ₫óng các ₫ối tượng ₫ược dùng lại dscan.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 38
  20. 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file ‰ Đọc/ghi dữ liệu trên các biến thuộc kiểu giá trị (int, double, char[], ) rấr dễ vì nội dung của các biến này không chứa tham khảo ₫ến các thành phần khác. Ngược lại, việc ₫ọc/ghi nội dung của 1 ₫ối tượng thường rất khó khăn vì ₫ối tượng có thể chứa nhiều tham khảo ₫ến các ₫ối tượng khác và các ₫ối tượng có thể tham khảo vòng lẫn nhau. Để hỗ trợ việc ₫ọc/ghi nội dung của ₫ối tượng, VC# ₫ề nghị kỹ thuật "Serialization". ‰ Một ₫ối tượng chỉ có thể ₫ược "serialize/deserialize" (ghi/₫ọc dùng kỹ thuật Serialization) nếu nó thuộc class "serializable". Để ₫ịnh nghĩa 1 class "serializable" dễ dàng và ₫ơn giản nhất, ta chỉ cần thêm mệnh ₫ề [Serializable] trước phát biểu ₫ịnh nghĩa class ₫ó: [Serializable] public class A { } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 39 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file ‰ Để ghi 1 ₫ối tượng (và toàn bộ các ₫ối tượng mà nó phụ thuộc) ở dạng nhị phân, ta viết template như sau : //1. xử lý và xây dựng ₫ối tượng B b; //2. ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa kết quả FileStream fs = new FileStream("c:\\data.obj", FileMode.Create); //3. tạo ₫ối tượng BinaryFormatter phục vụ ghi ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //4. gọi tác vụ Serialize của formatter ₫ể ghi ₫ối tượng formatter.Serialize(fs, b); //₫óng file lại fs.Flush(); fs.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 40
  21. 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file ‰ Để ₫ọc lại 1 ₫ối tượng (và toàn bộ các ₫ối tượng mà nó phụ thuộc) ở dạng nhị phân ta, viết template như sau : //1. ₫ịnh nghĩa biến ₫ối tượng ₫ể chứa nội dung từ file B b; //2. ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa dữ liệu ₫ã có FileStream fs = new FileStream("c:\\data.obj", FileMode.Open); //3. tạo ₫ối tượng BinaryFormatter phục vụ ₫ọc ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //4. gọi tác vụ Deserialize ₫ể ₫ọc ₫ối tượng từ file vào b = (B) formatter.Deserialize(fs); //₫óng file lại fs.Close(); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 41 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng ‰ Giả sử ta có hệ thống các ₫ối tượng với trạng thái và mối quan hệ giữa chúng cụ thể như sau. Lưu ý chúng có mối quan hệ bao gộp dạng vòng : intB1 = 2 dblB2 = 2.345 intA1 = 1 dblA2 = 1.234 pab ba pba intA1 = 3 pba1 dblA2 = 3.456 pab intA1 = 4 ₫ối tượng class B dblA2 = 4.567 ₫ối tượng class A pab Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 42
  22. 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng ‰ Giả sử biến b ₫ang tham khảo tới ₫ối tượng class B. Hãy viết chương trình ghi hệ thống ₫ối tượng này lên file ₫ể khi cần, ₫ọc lại vào bộ nhớ hầu xử lý tiếp. ‰ Qui trình xây dựng ứng dụng giải quyết yêu cầu trên như sau : 1. Chạy VS .Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project. 2. Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon "Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td. WRObject), click button OK ₫ể tạo Project theo các thông số ₫ã khai báo. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 43 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng 3. Ngay sau Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị. Thêm lệnh các using sau ₫ây vào ₫ầu file : using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; 4. Viết code cho hàm Main và các hàm dịch vụ khác nhau sau : class Program { static String fbuf; static void Main(string[] args) { //₫iểm nhập của chương trình //xây dựng hệ thống ₫ối tượng và ghi lên file Create_SaveObject(); //₫ọc lại hệ thống ₫ối tượng //ReadObject(); } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 44
  23. 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng //hàm xây dựng hệ thống ₫ối tượng và ghi lên file public static void Create_SaveObject() { //khở tạo ₫ối tượng b theo hình ở silde 24 B b = new B(); b.init(2,2.345); b.Setba(1,1.234,b); b.Setpba(3,3.1416,b); b.Setpba1(4,4.567,b); Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 45 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng //ghi ₫ối tượng b dùng kỹ thuật Serialization try { //1. ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa kết quả FileStream fs = new FileStream("c:\\data.obj", FileMode.Create); //2. tạo ₫ối tượng BinaryFormatter phục vụ ghi ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //3. gọi tác vụ Serialize của formatter ₫ể ghi ₫ối tượng formatter.Serialize(fs,b); //4. ₫óng file lại fs.Flush(); fs.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 46
  24. 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng //hàm ₫ọc ₫ối tượng b dùng kỹ thuật Serialization public static void ReadObject() { try { //1. ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa dữ liệu ₫ã có FileStream fs = new FileStream("c:\\data.obj", FileMode.Open); //2. tạo ₫ối tượng BinaryFormatter phục vụ ₫ọc ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //3. gọi tác vụ Deserialize ₫ể ₫ọc ₫ối tượng từ file vào B b = (B) formatter.Deserialize(fs); //4. ₫óng file lại fs.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } //hết hàm Main } //hết class program Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 47 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng 5. Ấn phải chuột vào phần tử gốc của cây Project trong cửa sổ Solution Explorer, chọn option Add.Class, ₫ặt tên là A.cs ₫ể tạo ra file ₫ặc tả class A. Khi cửa sổ hiển thị mã nguồn của class A hiển thị, ₫ặc tả class A như ₫oạn code dưới ₫ây : //thêm lệnh using sau ở ₫ầu file using System.Runtime.Serialization; namespace WRObject { [Serializable] public class A { //₫ịnh nghĩa các thuộc tính dữ liệu private int intA1; private double dblA2; private B pab; Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 48
  25. 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng //₫ịnh nghĩa các tác vụ public A() {} public void init(int a1, double a2, B p) { this.intA1 = a1; this.dblA2 = a2; this.pab = p; } } } 6. Ấn phải chuột vào phần tử gốc của cây Project trong cửa sổ Solution Explorer, chọn option Add.Class, ₫ặt tên là B.cs ₫ể tạo ra file ₫ặc tả class B. Khi cửa sổ hiển thị mã nguồn của class B hiển thị, ₫ặc tả class B như ₫oạn code dưới ₫ây : Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 49 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng //thêm lệnh using sau ở ₫ầu file using System.Runtime.Serialization; namespace WRObject { [Serializable] public class B { //₫ịnh nghĩa các thuộc tính dữ liệu private int intB1; private double dblB2; private A ba; private A pba; private A pba1; //₫ịnh nghĩa các tác vụ public B() { } Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 50
  26. 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng public void init(int b1, double b2) { this.intB1 = b1; this.dblB2 = b2; ba = new A(); pba = new A(); pba1 = new A(); } public void Setba (int a1, double a2, B b) { this.ba.init (a1,a2,b); } public void Setpba (int a1, double a2, B b) { this.pba.init (a1,a2,b); } public void Setpba1 (int a1, double a2, B b) { this.pba1.init (a1,a2,b); } } //hết class B } //hết namespace WRObject Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 51 8.8 Thí dụ về ₫ọc/ghi hệ thống ₫ối tượng 7. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Hệ thống ₫ối tượng sẽ ₫ược tạo ra và lưu lên file c:\data.obj. 8. Hiển thị cửa sổ soạn mã nguồn file Program.cs, chú thích lệnh gọi Create_SaveObject(); và bỏ chú thích lệnh gọi ReadObject();. Dời chuột về lệnh "B b = (B) formatter.Deserialize(fs);" trong hàm ReadObject(), click chuột vào lệnh trái của lệnh này ₫ể thiết lập ₫iểm dừng. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Ứng dụng sẽ dừng ở lệnh dừng. Dời chuột về biến b, ta thấy cửa sổ hiển thị giá trị của biến này lúc này là null. 9. Ấn F10 ₫ể thực hiện ₫úng lệnh này rồi dừng lại, dời chuột về biến b, rồi mở rộng cây phân cấp miêu tả nội dung biến b và thấy nó chứa ₫úng thông tin như slide 14, nghĩa là chương trình ₫ã ₫ọc ₫ược toàn bộ hệ thống ₫ối tượng ₫ã lưu giữ trước ₫ây. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 52
  27. 8.9 Kết chương ‰ Chương này ₫ã giới thiệu các ₫ối tượng phục vụ ghi/₫ọc dữ liệu ra/vào file cùng các tác vụ ghi/₫ọc dữ liệu cổ ₫iển ra/vào file. ‰ Chương này cũng ₫ã giới thiệu các ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file cùng các tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file. Khoa Khoa học & Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Chương 8 : Ghi/₫ọc dữ liệu của ứng dụng C# ra file © 2010 Slide 53