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

pdf 53 trang yennguyen 2480
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

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:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_8_ghidoc_du_lieu.pdf