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 - Nguyễn Văn Hiệp
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ươn
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 - Nguyễn Văn Hiệp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung 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 - Nguyễn Văn Hiệp
Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 1 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 Chương 8 Ghi/₫ọc dữ liệu của ứng dụng C# ra file Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 2 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 3 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 4 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 5 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 6 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 7 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 8 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 9 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 10 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 11 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 12 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 13 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 14 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 15 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 16 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 17 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 18 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 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ó 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 20 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 21 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 22 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 23 8.5 Ghi/₫ọc dữ liệ ... dString 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 31 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 32 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 33 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 34 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 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 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 36 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 37 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 38 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 39 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 40 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 41 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 42 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 ba pba pba1 intA1 = 3 dblA2 = 3.456 pab intA1 = 4 dblA2 = 4.567 pab ₫ối tượng class B ₫ối tượng class A intA1 = 1 dblA2 = 1.234 pab Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 43 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 44 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 45 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 46 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 47 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 48 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 49 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 50 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 51 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 52 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 Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : 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 Slide 53 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.
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_8_ghidoc_du_lieu.pdf