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

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

 

pdf 53 trang phuongnguyen 5720
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", để 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

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
 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
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
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
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
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
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
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.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
8.5 Ghi/₫ọc dữ liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân
 Lưu ý :
 . khi₫ọc1dữliệutừfilenhịphânvào,máysẽ₫ể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
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
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
 ... ing 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
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
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
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
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
 Bb;
 //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
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
 Bb;
 //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
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
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
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
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
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);"tronghà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
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

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_8_ghidoc_du_lieu.pdf