Hướng dẫn lập trình VB.NET - Chương 12: Khám phá cách xử lý file văn bản và chuỗi
Nội dung thảo luận:
- Hiển thị nội dung file text bằng đối tượng TextBox
- Lưu các thông tin trong file text
- Sử dụng kỹ thuật xử lý chuỗi để sắp xếp và mã hóa file Text
Trong chương này chúng ta học cách xử lý file text đơn giản với các thao tác như mở file, hiển thị nội dung, lưu và các thao tác khác như xử lý chuỗi trong chương trình thông qua lớp chuỗi String. Bạn có thể sắp xếp, ghép nối mã hóa hiển thị từng từ, từng dòng và toàn bộ nội dung văn bản trong file text.
trực tiếp: Sắp xếp chèn trực tiếp dựa trên ý tưởng như sau: coi mảng đó có đoạn đầu (i-1 phần tử) đã sắp xếp. Ta chạy vòng lặp từ phần tử tiếp theo (phần tử thứ i) và chèn các phần tử tiếp theo đó vào đoạn đầu sao cho theo trật tự qui định (tăng hay giảm). Vậy nếu muốn sắp xếp một mảng thì đoạn đầu tiên sẽ gồm một phần tử duy nhất a[0] và tiến hành chèn các phần tử từ a[1]. Việc chèn tiến hành như sau: lưu a[i] vào biến x. Cho biến j chạy từ đầu mảng (từ 1) và xét xem x =a[j] hay j = 0 và đặt x vào vị trí j+1. Thủ tục InsertionSort() được cài đặt trong SortModule như sau: 'Sap xep theo phuong phap chen truc tiep Sub InsertionSort(ByRef mang() As String, _ ByVal sophantumang As Short) Dim i, j As Short Dim tam As String For i = 1 To sophantumang tam = mang(i) j = i - 1 Do While ((tam 0)) mang(j + 1) = mang(j) j -= 1 Loop mang(j + 1) = tam Next End Sub Lúc này cũng tương tự như cách gọi trên, bạn gọi thủ tục này thay cho lời gọi thủ tục sắp xếp SelectionSort.Và kết quả không có gì thay đổi. Sắp xếp nổi bọt: Sắp xếp nổi bọt là sắp xếp bằng cách đi từ trái qua phải, nếu thấy hai phần tử liền kề nhau không đúng trật tự thì đổi chỗ. Quá trình đó cứ lặp đi lặp lại như vậy cho đến khi thu được dãy có trật tự tăng hay giảm theo ý muốn. Thủ tục BubbleSort() được cài đặt trong SortModule như sau: 'Sap xep theo phuong phap noi bot Sub BubbleSort(ByRef mang() As String, _ ByVal sophantumang As Short) Dim i, j As Short i = sophantumang Do While i > 0 For j = 1 To i - 1 If mang(j) > mang(j + 1) Then doicho(mang(j), mang(j + 1)) End If Next j i -= 1 Loop End Sub Thủ tục đổi chỗ đã được khai báo trong module và trình bày trong phần trên. Bạn cũng thay lời gọi InsertiontSort bằng lời gọi thủ tục BubbleSort và xem kết quả có gì thay đổi không. Sắp xếp nhanh QuickSort: Sắp xếp trộn MergeSort: 4. Bảo vệ nội dung văn bản bằng cách mã hóa Bây giờ chúng ta thử mã hóa những gì có trong ô textbox để chỉ mình bạn là người có thể đọc được. Ta dùng một giải thuật mã hóa làm xáo trộn văn bản và một thuật toán giải mã để đưa văn bản trở về trạng thái ban đầu. 4.1. Mã hóa tài liệu bằng cách thay đổi mã ASCII của các ký tự Bây giờ chúng ta tạo chương trình mã hóa và tiến hành giải mã một file văn bản. Ta làm ví dụ EncriptionText. 4.2. Chương trình EncriptionText Tìm hiểu chương trình: Chương trình gồm một ô textbox để hiển thị nội dung văn bản. Một menu File với các mục chọn: Open Encription File dùng để mở các file đã mã hóa; Encript File dùng để mã hóa nội dung văn bản có trong ô textbox; Decription File giải mã nội dung văn bản đã bị mã hóa; Save Encription lưu lại nội dung văn bản đã mã hóa vào một file; Close để đóng file và đưa ô textbox về trạng thái trắng. Thiết kế giao diện: Giao diện thiết kế như hình: Các bạn tạo các điều khiển như hình và kéo các điều khiển khác gồm OpenFileDialog1 để mở file, MenuStrip1, SaveFileDialog1 để lưu file. Các thuộc tính thay đổi như sau: Open Encription File: name là mnuOpenEncriptionFile Encript File: name là mnuEncriptionFile Decription File: name là mnuDecription Save Encription: name là mnuSaveEncription &Close: name là mnuClose TextBox: name là txtDocument Viết mã: Tạo thủ tục mở file: Private Sub mnuOpenEncriptionFile_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuOpenEncriptionFile.Click Dim all, line As String OpenFileDialog1.Filter = "TEXT FILES (*.TXT) | *.TXT" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName "" Then Try FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) Do Until EOF(1) line = LineInput(1) all = all & line Loop txtDocument.Text = all mnuClose.Enabled = True mnuDecription.Enabled = True mnuOpenEncriptionFile.Enabled = False Catch ex As Exception MsgBox("Lỗi mở File!") Finally FileClose(1) End Try End If End Sub Thủ tục lưu file: Private Sub mnuSaveEncription_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuSaveEncription.Click SaveFileDialog1.Filter = "TEXT FILES (*.TXT) | *.TXT" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName "" Then Try FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, txtDocument.Text) Catch ex As Exception MsgBox("Lỗi mở file!") Finally FileClose(1) End Try mnuClose.Enabled = True mnuSaveEncription.Enabled = False End If End Sub Thủ tục đóng file: Private Sub mnuClose_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuClose.Click txtDocument.Text = "" mnuOpenEncriptionFile.Enabled = True mnuClose.Enabled = False mnuDecription.Enabled = False mnuEncriptionFile.Enabled = False mnuSaveEncription.Enabled = False End Sub Thủ tục mã hóa: Private Sub mnuEncriptionFile_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuEncriptionFile.Click Dim Encript As String = "" Dim letter As Char Dim i, charsInFile As Short charsInFile = txtDocument.Text.Length For i = 0 To charsInFile - 1 letter = txtDocument.Text.Substring(i, 1) Encript = Encript & Chr(Asc(letter) + 1) Next txtDocument.Text = Encript mnuClose.Enabled = True mnuSaveEncription.Enabled = True mnuDecription.Enabled = True End Sub Trong thủ tục trên ta mã hóa bằng cách tăng mã của ký tự trong bảng mã ASCII lên một bằng dòng lệnh: Encript = Encript & Chr(Asc(letter) + 1) Thủ tục giải mã: Private Sub mnuDecription_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuDecription.Click Dim i, charsInFile As Short Dim letter As Char Dim Decript As String = "" charsInFile = txtDocument.Text.Length For i = 0 To charsInFile - 1 letter = txtDocument.Text.Substring(i, 1) Decript = Decript & Chr(Asc(letter) - 1) Next txtDocument.Text = Decript mnuClose.Enabled = True mnuSaveEncription.Enabled = False mnuEncriptionFile.Enabled = True mnuDecription.Enabled = True End Sub Việc giải mã là tiến hành trừ mã của ký tự trong bảng mã ASCII đi 1 với dòng mã: Decript = Decript & Chr(Asc(letter) - 1) Chạy chương trình: Bạn ấn F5 chạy chương trình và có thể mở file văn bản hay gõ nội dung vào textbox để mã hóa và giải mã. Điều này thật thú vị. 5. Sử dụng toán tử XOR trong mã hóa Với cách mã hóa trên đây có rất nhiều hạn chế. Hạn chế đầu tiên đó là mã ASCII chỉ giới hạn từ 0-255, nếu cộng ra ngoài khoảng này thì chương tình sẽ gặp lỗi ngay. Cách khắc phục là ta dùng toán tử XOR, khi XOR một số với một giá trị nào đó hai lần thì bạn sẽ nhận lại chính số đó. Chúng ta hãy làm rõ điều này thông qua ví dụ XorEccriptionTextFile: Tìm hiểu chương trình: Chương trình có một textbox cho phép hiển thị cũng như nhập liệu văn bản; một menu File với ba mục chọn là Open Encription File cho phép mở file đã mã hóa. Khi mở file này chương trình sẽ yêu cầu người dùng nhập chính xác khóa đã dùng để mã hóa khi mã hóa. Mục chọn thứ hai là Save Encription File. Mục này cho phép người dùng mã hóa nội dung văn bản gõ vào trong ô textbox. Chương trình sẽ đưa ra thông báo yêu cầu người dùng nhập vào một khóa dùng để mã hóa. Người dùng cần nhớ chính xác từ khóa này để giải mã file sau này. Mục chọn Close sẽ đưa textbox về dạng trắng và hiện mục Open Encription File lên cho người dùng mở file, hoặc gõ văn bản vào ô textbox để làm sáng mục chọn Save. Thiết kế giao diện: Giao diện của chương trình như hình: Bạn tạo giải pháp và thêm vào dự án cùng tên rồi thiết kế giao diện như hình. Viết mã: Tạo thủ tục mnuSaveEncriptionFile_Click mã hóa văn bản và lưu vào file: Private Sub mnuSaveEncriptionFile_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuSaveEncriptionFile.Click Dim letter As Char Dim key As String Dim i, charsInFile, code As Short SaveFileDialog1.Filter = "TEXT FILES (*.TXT) | *.TXT" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName "" Then key = InputBox("Nhap khoa ma hoa:") If key = "" Then Exit Sub code = CShort(key) charsInFile = txtDocument.Text.Length FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) For i = 0 To charsInFile - 1 letter = txtDocument.Text.Substring(i, 1) Print(1, Asc(letter) Xor code) Next FileClose(1) mnuClose.Enabled = True End If End Sub Trước hết, chương trình sẽ yêu cầu nhập vào một khóa bằng phát biểu: key = InputBox("Nhap khoa ma hoa:") Sau đó nó tiến hành XOR mã ASCII của ký tự với khóa và ghi vào file bằng phát biểu: Print(1, Asc(letter) Xor code) Thủ tục mnuOpenEncriptionFile_Click giải mã: Private Sub mnuOpenEncriptionFile_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuOpenEncriptionFile.Click Dim ch As Char Dim key As String Dim code, number As Short Dim DeEncript As String = "" OpenFileDialog1.Filter = "TEXT FILE (*.TXT) | *.TXT" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName "" Then Try key = InputBox("Nhap dung khoa da ma hoa:") If key = "" Then Exit Sub code = CShort(key) FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) Do Until EOF(1) Input(1, number) ch = Chr(number Xor code) DeEncript = DeEncript & ch Loop txtDocument.Text = DeEncript txtDocument.Enabled = True mnuClose.Enabled = True mnuOpenEncriptionFile.Enabled = False Catch ex As Exception MsgBox("Loi mo File!") Finally FileClose(1) End Try End If End Sub Thủ tục này cũng tương tự. Trước hết yêu cầu nhập vào khóa đã dùng để mã hóa và sau đó tiến hành giải mã bằng cách XOR lại một lần nữa để thu được mã ASCII ban đầu và chuyển trở lại ký tự bằng hàm Chr: ch = Chr(number Xor code) Vậy là chương trình đã hoàn thành. Chạy chương trình: Bạn chạy chương trình, nhập vào textbox một đoạn văn bản bất kỳ: Tiến hành mã hóa và lưu lại vào file có tên mahoa.txt với từ khóa là 123. File đó sẽ có nội dung như sau: Bây giờ bạn đóng lại bằng cách chọn mục Close và mở lại file trên xem sao. 6. Tổng kết chương Bạn có thể làm lại các bài tập đã thực hiện trong chương này.
File đính kèm:
- Hướng dẫn lập trình VB.NET - Chương 12_Khám phá cách xử lý file văn bản và chuỗi.doc