В этой лекции вы узнаете, как:
Управление электронными документами во многих сферах деятельности является очень важной задачей, и Microsoft Visual Basic .NET предоставляет различные механизмы для работы с различными типами документов и обработки их содержимого. Наиболее общим типом документов является текстовый файл, который состоит из неотформатированных слов и параграфов, букв, цифр и специальных символов различного назначения. В этой лекции вы узнаете, как работать с информацией, хранящейся в вашей системе в текстовых файлах. Вы узнаете, как открывать текстовый файл и отображать его содержимое с помощью объекта текстового поля и как создавать на диске новый текстовый файл. Вы также узнаете об управлении строками в вашей программе, и будете использовать методы, принадлежащие классу String из .NET Framework, чтобы объединять, шифровать и отображать слова, строки и целые текстовые файлы.
Open, Line Input #, Print #, EOF и Close. В Visual Basic .NET имеется новый набор функций, которые выполняют операции с текстовыми файлами. Эти функции предоставляются объектом FileSystem из пространства имен Microsoft.VisualBasic, и включают FileOpen, LineInput, PrintLine и FileClose.System.IO. Объекты в пространстве имен System.IO не заменяют приведенных ранее встроенных функций Visual Basic .NET, а дополняют их.String из .NET Framework. Например, новый метод SubString предоставляет функциональность, аналогичную функции Mid из Visual Basic, а метод ToUpper аналогичен функции UCase из Visual Basic. Для обработки текстов вы можете использовать любой из этих методов, но рекомендуется использовать более новые.Простейшим способом отображения в программе текстового файла является использование объекта текстового поля. Вы можете создать объекты текстового поля различного размера. Если содержимое текстового файла не помещается в текстовое поле, можно добавить к текстовому полю полосы прокрутки так, что пользователь сможет увидеть весь текст. Чтобы загрузить в текстовое поле содержимое текстового файла, необходимо использовать четыре функции. Эти функции описаны в следующей таблице и будут продемонстрированы в первом упражнении этой лекции. Некоторые из этих функций заменяют старые ключевые слова языка Visual Basic.
| Функция | Описание |
|---|---|
| FileOpen | Открывает текстовый файл для ввода или вывода |
| LineInput | Читает строку ввода из текстового файла |
| EOF | Проверяет на достижение конца текстового файла |
| FileClose | Закрывает текстовый файл |
Текстовый файл состоит из одной или более строк цифр, слов или символов. Текстовые файлы отличаются от файлов документов, которые содержат форматирующие коды, и от исполняемых файлов, которые содержат инструкции для операционной системы. Обычные текстовые файлы в вашей системе будут определяться проводником Microsoft Windows как "
Можно разрешить пользователю выбирать, какой текстовый файл в программе следует открыть. Это делается с помощью элемента управления OpenFileDialog, который спросит у пользователя путь к файлу. Элемент управления OpenFileDialog содержит свойство Filter, которое управляет тем, какой тип файлов в нем отображается, метод ShowDialog, который отображает диалоговое окно Open (Открыть), и свойство FileName, которое возвращает путь, указанный пользователем. Элемент управления OpenFileDialog не открывает файл, он просто предоставляет путь к нему.
Получив от пользователя путь, вы открываете в вашей программе файл с помощью функции FileOpen. Сокращенный синтаксис функции FileOpen имеет вид
FileOpen(номер_файла, путь, режим)
Полный список аргументов вы можете найти в справочной системе Visual Basic. Вот наиболее важные:
OpenMode.Input и OpenMode.Output.)Номер файла будет ассоциирован с файлом при его открытии. Затем вы будете использовать это число в вашем коде всегда, когда нужно будет сослаться на этот открытый файл. Кроме этой ассоциации есть еще один момент, касающийся этих чисел - Visual Basic использует их для отслеживания различных открываемых в вашей программе файлов.
Обычная функция FileOpen с использованием объекта OpenFileDialog выглядит так:
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Здесь свойство OpenFileDialog1.FileName представляет путь, OpenMode.Input - это режим, а 1 - это номер файла.
В следующем упражнении демонстрируется, как использовать для открытия текстового файла элемент управления OpenFileDialog и функцию FileOpen, а также функции LineInput и EOF для отображения содержимого текстового файла в текстовом поле и функцию FileClose для закрытия файла.
Если форма проекта не отображается, отобразите ее сейчас. Появится форма Просмотр текста, показанная ниже.

Эта форма содержит большое текстовое поле, которое имеет полосы прокрутки. Она также содержит главное меню (с командами Открыть, Закрыть и Выход ), диалог открытия файла и метку, которая выдает инструкции к действию. Я также создал установки свойств, показанные в следующей таблице. (Обратите особое внимание на установки текстового поля.)
| Объект | Свойство | Установка |
|---|---|---|
| txtNote | Enabled | False |
| Multiline | True | |
| Name | txtNote | |
| ScrollBars | Both | |
| Text | пустой (empty) | |
| mnuOpenItem | Name | mnuOpenItem |
| mnuCloseItem | Enabled | False |
| Name | mnuCloseItem | |
| lblNote | Text | "Загрузите текстовый файл с помощью команды Открыть" |
| Name | lblNote | |
| Form1 | Text | "Просмотр текста" |
Откройте папку c:\vbnet03sbs\Гл.12\text browser. Содержимое папки Text Browser показано здесь.

Сделайте двойной щелчок мышью на имени файла SocialStructure.txt. Как показано ниже, в текстовом поле появится SocialStructure - текстовый файл, содержащий статью, посвященную социальному расслоению общества.

Теперь посмотрите на две важных процедуры событий этой программы.
mnuOpenItem_Click.Если это необходимо, измените размер Редактора кода так, чтобы увидеть как можно больший фрагмент кода. Процедура события mnuOpenItem_Click содержит следующий код программы:
Dim AllText, LineOfText As String
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)¦*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Open
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью
' обработчика
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
LineOfText = LineInput(1)
'добавляем каждую строку в переменную AllText
AllText = AllText LineOfText vbCrLf
Loop
lblNote.Text = OpenFileDialog1.FileName 'обновляем метку
txtNote.Text = AllText ' отображаем файл
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Закрыть
mnuOpenItem.Enabled = False 'отключаем команду Открыть
Catch
MsgBox("Ошибка открытия файла.")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Эта процедура события выполняет следующие действия:
Filter диалога открытия файла.OpenFileDialog1 запрашивает у пользователя путь.Try...Catch перехватывает ошибки.FileOpen открывает указанный файл для ввода.LineInput для построчного копирования файла в строку с именем AllText.EOF ) или пока в строке не останется больше места. В AllText есть место для очень большого файла, но если в процессе копирования произойдет ошибка, блок Catch выведет сообщение об этой ошибке.AllText в текстовом поле, удаляет выделение и включает полосы прокрутки и текстовый курсор.Обновляет команды меню Файл и закрывает файл с помощью функции FileClose.
Потратьте некоторое время, чтобы понять, как работают операторы в процедуре события mnuOpenItem_Click - особенно функции FileOpen, LineInput, EOF и FileClose. Чтобы получить дополнительную информацию об этих операторах и функциях, выделите интересующее вас ключевое слово и нажмите (F1), чтобы увидеть его описание в справочной системе Visual Basic. При возникновении ошибки обработчик ошибок в этой процедуре отображает сообщение и прерывает процесс загрузки.
Отобразите процедуру события mnuCloseItem_Click, которая исполняется при щелчке на команде меню Закрыть. Процедура события mnuCloseItem_Click выглядит так:
txtNote.Text = "" 'очищаем текстовое поле lblNote.Text = "Загрузите текстовый файл с помощью команды Открыть." mnuCloseItem.Enabled = False 'отключаем команду Закрыть mnuOpenItem.Enabled = True 'включаем команду Открыть
Эта процедура очищает текстовое поле, обновляет метку lblNote, отключает команду Закрыть и включает команду Открыть.
Теперь вы можете использовать эту простую программу как шаблон для создания более продвинутых утилит для обработки текстовых файлов. В следующем разделе вы узнаете, как вводить в текстовое поле собственный текст, и как сохранять текст из текстового поля в файл на диске.
В дополнение к командам Visual Basic, которые открывают и отображают текстовые файлы, имеется новый класс StreamReader из библиотеки .NET Framework, который позволяет открывать и отображать в программах текстовые файлы. В этой книге я буду использовать для работы с текстовыми файлами как встроенные функции Visual Basic, так и класс StreamReader.
Чтобы использовать класс StreamReader, необходимо добавить в начало вашего кода следующий оператор Imports, который предоставляет доступ к классу StreamReader:
Imports System.IO
Затем, если ваша программа сдержит объект текстового поля, вы можете отобразить этот текстовый файл в этом текстовом поле с помощью следующего кода программы. (Текстовый файл, открывающийся в этом примере - это Readme.txt, и код предполагает, что в вашей форме создан объект с именем TextBox1.)
Dim StreamToDisplay As StreamReader
StreamToDisplay = New StreamReader("c:\vbnet03sbs\Гл.14\readme.txt")
TextBox1.Text = StreamToDisplay.ReadToEnd
StreamToDisplay.Close()
TextBox1.Select(0, 0)
StreamReader - это альтернативный по отношению к использованию функций Visual Basic способ открывать текстовый файл, предоставляемый .NET Framework. В этом примере использования StreamReader я объявляю переменную StreamToDisplay типа StreamReader, в которой хранится содержимое текстового файла, а затем указываю правильный путь к файлу, который я хочу открыть. Затем с помощью метода ReadToEnd, который получает из файла весь текст, начиная с текущей позиции (начало текстового фала) и до конца этого файла, я считываю содержимое текстового файла в переменную StreamToDisplay, и присваиваю ее свойству Text текстового поля. Последние операторы закрывают текстовый файл и используют метод Select для удаления выделения в текстовом поле.
Вы будете использовать эту запись StreamReader в лекции 15 в качестве альтернативы для встроенных в Visual Basic функций для работы с файлами.
Чтобы создать на диске новый текстовый файл с помощью Visual Basic, используется множество функций и ключевых слов, которые вы уже применяли в последнем примере. Создание новых файлов на диске и сохранение в них данных полезно, если вы планируете создавать собственные отчеты или журналы, сохранять важные вычисления или значения или создавать специальный текстовый процессор или текстовый редактор. Вот обзор шагов, которые вы должны сделать в такой программе:
InputForFile.SaveFileDialog запросите у пользователя путь к файлу. Для отображения этого диалогового окна вы используете метод ShowDialog.PrintLine .FileClose.В следующем упражнении демонстрируется, как можно использовать элементы управления TextBox и SaveFileDialog для построения простой утилиты создания заметок. Эта программа использует для открывания файла функцию FileOpen, для сохранения в нем данных - функцию , а для закрытия файла - функцию FileClose. Вы можете использовать этот инструмент дома или на работе для создания заметок, а затем привязки их к текущей дате.
Если форма проекта не отображается, отобразите ее сейчас. Появится форма Заметки, как показано на следующей иллюстрации. Она выглядит аналогично форме Просмотр текста. Однако я заменил в ней элемент управления OpenFileDialog на элемент управления SaveFileDialog. Меню Файл также содержит различные дополнительные команды, включая Сохранить как, Добавить дату и Выход.

Я установил следующие свойства этого проекта:
| Объект | Свойство | Установка |
|---|---|---|
| txtNote | Multiline | True |
| Name | txtNote | |
| ScrollBars | Both | |
| Text | пустой (empty) | |
| lblNote | Text | "Введите заметку, а затем сохраните ее на диск" |
| Form1 | Text | Заметки |
Введите в текстовое поле следующий или ваш собственный текст:
Принцип социальной мобильности
Это возможность перехода из одной общественной группы в другую, из одного класса в другой. Например:
Когда вы это сделаете, ваш экран должен выглядеть примерно так.

Теперь попробуйте использовать команды из меню Файл.
В меню Файл щелкните на команде Добавить дату. В первой строке текстового поля появится текущая дата, как показано ниже.

Команда Добавить дату предоставляет удобный способ включить в файл текущую дату. Это полезно, если вы создаете дневник или журнал.
Теперь посмотрите на процедуры событий этой программы.
В меню Файл программы Quick Note сделайте двойной щелчок мышью на команде Добавить дату. В Редакторе кода появится процедура события mnuInsertDateItem_Click. Вы увидите следующий программный код:
txtNote.Text = DateString vbCrLf txtNote.Text txtNote.Select(1, 0) 'удаление выделения
Эта процедура события добавляет в текстовое поле текущую дату (сгенерированную свойством DateString ), добавляя к ней символ возврата каретки (константу vbCrLf ) и значение свойства Text текстового поля. С помощью этой методики можно добавлять в текст, находящийся в текстовом поле, текущее время или любую другую информацию.
Задержитесь и посмотрите, как работают операторы конкатенации, а затем изучите в Редакторе кода процедуру события mnuSaveAsItem_Click. Вы увидите следующий программный код:
SaveFileDialog1.Filter = "Текстовые файлы (*.txt)¦*.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName <> "" Then FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, txtNote.Text) 'копируем текст на диск FileClose(1) End If
Этот блок операторов использует для отображения диалогового окна Сохранить как. Объект диалога сохранения файлов проверяет, выбрал ли пользователь файл, открывает этот файл для вывода как файл номер 1, записывает значение свойства txtNote.Text на диск с помощью функции , а затем закрывает этот текстовый файл. Обратите особое внимание на оператор
PrintLine(1, txtNote.Text) 'копируем текст на диск
который присваивает все содержимое текстового поля открытому файлу. аналогична старым операторам Visual Basic Print и Print # ; она направляет вывод в указанный файл, а не на экран или принтер. Здесь важно то, что весь файл сохраняется в свойстве txtNote.Text.
FileOpen, PrintLine и FileClose, а затем закройте программу с помощью команды Close Solution (Закрыть решение) из меню File (Файл).Вы закончили работу с программой Quick Note.
С помощью элемента управления TextBox и набора специальных операторов программы можно быстро открывать, редактировать и сохранять текстовые файлы на диск. Visual Basic также предоставляет несколько мощных операторов и функций, специально предназначенных для обработки в программах текстовых элементов. В этом разделе вы узнаете, как извлекать из текстовой строки полезную информацию, копировать список строк в массив и сортировать список строк.
Возможность сортировать набор строк очень полезна при работе с текстовыми элементами. Базовые концепции сортировки просты. Вы составляете список сортируемых элементов, а затем сравниваете элементы друг с другом и переставляете их до тех пор, пока список не окажется отсортированным по алфавиту в восходящем или нисходящем порядке. В Visual Basic вы можете производить сравнение одной строки с другой с помощью тех же операторов сравнения, которые вы используете для сравнения числовых значений. Фокус (который иногда вызывает длинные дискуссии среди компьютерных специалистов) здесь состоит в конкретном алгоритме сортировки, который вы используете для сравнения элементов списка. Мы не будем в этой лекции вдаваться в детали достоинств и недостатков различных алгоритмов сортировки. (Яблоком раздора обычно является скорость, которая имеет значение только тогда, когда сортируются несколько тысяч элементов.) Вместо этого мы изучим, как при сортировке производится базовое сравнение строк. По ходу дела вы узнаете о способах сортировки ваших собственных текстовых полей, полей списков, файлов и баз данных.
До сих пор при работе со строками чаще всего использовалась конкатенация их с помощью оператора конкатенации (). Например, следующий оператор программы производит конкатенацию трех символьных выражений и присваивает результат "Все в сад!" строковой переменной Slogan:
Dim Slogan As String Slogan = "Все" " в " "сад!"
Также можно производить конкатенацию и обрабатывать строки с помощью методов из класса String библиотеки .NET Framework. Например, метод String.Concat позволяет выполнить эквивалентную конкатенацию строк с помощью такой записи:
Dim Slogan As String
Slogan = String.Concat("Все", " в ", "сад!")
Соответственно, в Visual Basic .NET существует два метода для конкатенации строк и других задач по их обработке: можно использовать операторы и функции из более ранних версий Visual Basic ( Mid, UCase, LCase и т.д.), а можно новые методы из .NET Framework ( Substring, ToUpper, ToLower и т.д.). Никаких реальных ограничений на использование любой из этих методик не существует. В оставшейся части этой лекции представлено несколько полезных функций для обработки строк из класса String библиотеки .NET Framework, но иногда я буду использовать также и более старые
Следующая таблица содержит список методов .NET Framework, которые используются в последующих упражнениях, и их ближайшие эквиваленты из языка программирования Visual Basic .NET. В четвертом столбце этой таблицы приводится пример кода для методов класса String из библиотеки .NET Framework.
| Метод .NET Framework | Функция Visual Basic | Описание | Пример для .NET Framework |
|---|---|---|---|
ToUpper |
UCase |
Изменяет регистр букв строки на верхний | Dim Name, NewName As String Name = "Kim" NewName = Name.ToUpper 'NewName = "KIM" |
ToLower |
LCase |
Изменяет регистр букв строки на нижний | Dim Name, NewName As String Name = "Kim" NewName = Name.ToLower 'NewName = "kim" |
Length |
Len |
Определяет число символов в строке | Dim River As String Dim Size As Short River = "Mississippi" Size = River.Lengh 'Size = 11 |
Substring |
Mid |
Возвращает фиксированное число символов строки, начиная с заданной начальной позиции. (Примечание: первый элемент строки имеет индекс 0.) | Dim Cols, Middle As String Cols = "First Second Third" Middle = Cols.SubString (6, 6) |
IndexOf |
InStr |
Ищет точку вхождения одной строки в другой, более длинной | Dim Name As String
Dim Start As Short
Name = "Abraham"
Start = Name.IndexOf("h")
'Start = 4
|
Trim |
Trim |
Удаляет из строки "ведущие" и последующие пробелы | Dim Spacey, Trimmed As String Spacey = "Hello" Trimmed = Spacey.Trim 'Trimmed = "Hello" |
Remove |
Удаляет символы из середины строки | Dim RawStr, CleanStr As String RawStr = "Helli3333 there!" CleanStr = RawStr.Remove(5,3) 'CleanStr = "Hello there" |
|
Insert |
Добавляет символы в середину строки | DimOldstr, NewStr As String Oldstr = "Hi Felix" NewStr = OldStr.Insert(3, "there") 'NewStr = "Hi there Felix" |
|
StrComp |
Сравнивает строки, не обращая внимания на регистр | Dim str1 As Strng = "Soccer" Dim str2 As Strng = "SOCCER" Dim Match As Short Match = StrComp (str1, str2, CompareMethod.Text) 'Math = 0[string match] |
Прежде, чем Visual Basic сможет при сортировке сравнить один символ с другим, он должен преобразовать каждый из символов в число с помощью таблицы перевода, которая называется таблицей символов
В 1980-е годы IBM расширила ASCII кодами 128-255, которые содержали символы национальных языков, греческие символы, символы псевдографики и некоторые другие. ASCII и эти дополнительные символы обычно называются расширенной таблицей символов IBM.
Набор символов ASCII до сих пор является наиболее важным из изучаемых начинающими программистами набором кодов, но он не единственный. При расширении рынка компьютеров и прикладного программного обеспечения был разработан более сложный стандарт представления символов, который называется Unicode. Unicode может хранить до 65536 символов - вполне достаточно для того, чтобы представить традиционные символы набора ASCII и многочисленные международные символы. (На момент написания этого текста определено около 45000 символов.) Группа по поддержке этого стандарта создает набор символов Unicode и периодически добавляет в него новые символы. Microsoft Windows NT, Windows 2000, Windows XP, Windows Server 2003 и Visual Basic .NET были специально разработаны с поддержкой наборов символов ASCII и Unicode.
В следующих разделах пойдет речь об использовании набора символов ASCII для обработки строк. Когда ваши приложения станут более сложными, и вы начнете планировать глобальную дистрибуцию вашего программного обеспечения, вам понадобится узнать больше о Unicode и других международных установках.
Чтобы определить ASCII-код конкретной буквы, вы можете использовать функцию Asc из Visual Basic. Например, следующий оператор программы присваивает короткой целочисленной переменной AscCode число 122 (ASCII-код строчной буквы "z"):
Dim AscCode As Short
AscCode = Asc("z")
Точно так же, с помощью функции Chr можно преобразовать ASCII-код в букву. Например, этот оператор программы присваивает символьной переменной букву "z":
Dim letter As Char letter = Chr(122)
Такой же результат можно получить, если вы будете использовать только что объявленную переменную AscCode:
letter = Chr(AscCode)
Как можно сравнить одну текстовую строку или ASCII-код с другой? Вы просто должны использовать один из операторов сравнения, предоставляемых Visual Basic для работы с текстовыми и числовыми элементами. Эти операторы сравнения приведены в следующей таблице:
| Оператор | Значение |
|---|---|
| <> | Не равно |
| = | Равно |
| < | Меньше, чем |
| > | Больше, чем |
| <= | Меньше или равно |
| >= | Больше или равно |
Символ "больше, чем" другой символ, если его ASCII-код больше. Например, значение ASCII буквы "Б" больше, чем значение ASCII буквы "A", так что выражение
"A" < "Б"
истинно, а выражение
"A" > "Б"
ложно.
При сравнении двух строк, которые содержат больше одного символа, Visual Basic начинает со сравнения первого символа в первой строке с первым символом во второй строке, а затем продолжает посимвольное сравнение этих строк до тех пор, пока не найдет различие. Например, строки Mike и Michael одинаковы до третьего символа ("k" и "c"). Так как значение ASCII "k" больше, чем значение "c", выражение
"Mike" > "Michael"
истинно.
Если между строками не найдено различий, то они равны. Если две строки равны на протяжении нескольких символов, но одна строка продолжается, а вторая заканчивается, то более длинная строка больше, чем более короткая. Например, выражение
"AAAAA" > "AAA"
истинно.
В следующем упражнении демонстрируется, как можно использовать операторы сравнения и некоторые строковые методы и функции для сортировки строк текста в текстовом поле. Программа является доработанной версией утилиты Quick Note и содержит команду Открыть, которая позволяет открывать существующий файл, и команду Закрыть, которая закрывает этот файл. Также в ней имеется команда Сортировка текста в меню Файл, которую вы можете использовать для сортировки текста, отображаемого в настоящий момент в текстовом поле.
Так как все содержимое текстового поля хранится в одной строке, вначале программа должна разбить эту длинную строку на более короткие отдельные строки. Затем эти строки можно отсортировать с помощью Sub-процедуры ShellSort - процедуры сортировки по алгоритму, созданному в 1959 году Дональдом Шеллом. Чтобы упростить эту задачу, я создал стандартный модуль, который определяет динамический строковый массив, который будет хранить каждую из строк текстового поля. Я также поместил в этот стандартный модуль процедуру ShellSort, так что я могу вызывать ее из любой процедуры события проекта. (Подробнее о стандартных модулях см. в лекции 10.)
Одним из интересных моментов этой программы является процедура, которая определяет число строк в объекте текстового поля. В Visual Basic нет функции, которая бы автоматически вычисляла это значение. Я хотел, чтобы программа смогла построчно сортировать текстовое поле любого размера. Для этого я создал код, имеющий следующий вид. Он использует метод Substring для поиска в объекте текстового поля единственного символа, а затем функцию Chr для поиска символа возврата каретки (чей ASCII-код равен 13), стоящего в конце каждой строки. (Особенно обратите внимание на то, как в качестве части свойства Text объекта txtNote используется метод Substring - класс String автоматически предоставляет этот метод, а также многие другие для любых свойств или переменных, которые объявлены как имеющие тип String.)
Dim ln, curline, letter As String Dim i, charsInFile, lineCount As Short 'определяем число строк объекта текстового поля (txtNote) lineCount = 0 'эта переменная содержит общее количество строк charsInFile = txtNote.Text.Length 'получаем общее число символов For i = 0 To charsInFile (Файл) - 1 'берем по одному символу за раз letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки lineCount += 1 'переходим на следующую строку (увеличиваем счетчик) i += 1 'пропускаем символ перевода строки (всегда следует 'за возвратом каретки) End If Next i
Общее число строк в текстовом поле присваивается короткой целой переменной lineCount. Далее в программе это значение используется для задания размера динамического массива, который хранит все строки по отдельности. Затем окончательный массив строк передается в процедуру ShellSort для сортировки, и ShellSort возвращает строковый массив, отсортированный по алфавиту. Когда строковый массив отсортирован, я просто копирую его в цикле For обратно в текстовое поле.
Введите в текстовое поле следующий или какой-нибудь собственный текст:
Зебра Горилла Луна Банан Яблоко Черепаха
Убедитесь, что после слова Черепаха или вашей собственной последней строки вы ввели (Enter), иначе Visual Basic не сможет корректно рассчитать число строк.
В меню Файл щелкните на команде Сортировка текста. Только что введенный вами текст будет отсортирован и снова выведен в текстовое поле, как показано ниже.

Щелкните на команде Открыть из меню Файл и откройте файл abc.txt, расположенный в папке c:\vbnet03sbs\Гл.12, как показано ниже.

Файл abc.txt содержит 24 строки текста. Каждая строка начинается либо с буквы, либо с цифры (1-10).
Чтобы отсортировать содержимое файла abc.txt, щелкните в меню Файл на команде Сортировка текста. Программа Sort Text отсортирует файл в алфавитном порядке и отобразит отсортированные строки в текстовом поле, как показано ниже.

Откройте Редактор кода и отобразите код процедуры события mnuSortTextItem_Click. Мы уже обсуждали первую часть этой процедуры события, которая с помощью метода Substring подсчитывает число строк в текстовом поле и ищет коды возврата каретки. Остальная часть процедуры события задает размерность строкового массива, копирует в этот массив все строки текста, вызывает процедуру для сортировки массива и отображает переупорядоченный список в текстовом поле. Полная процедура события mnuSortTextItem_Click выглядит так:
Dim ln, curline, letter As String Dim i, charsInFile, lineCount As Short 'определяем число строк объекта текстового поля (txtNote) lineCount = 0 'эта переменная содержит общее количество строк charsInFile = txtNote.Text.Length 'получаем общее число символов For i = 0 To charsInFile - 1 'берем по одному символу letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки lineCount += 1 'переходим на следующую строку (увеличиваем счетчик) i += 1 'пропускаем символ перевода строки (всегда следует за возвратом 'каретки) End If Next i 'создаем массив для хранения текста из текстового поля ReDim strArray(lineCount) 'создаем массив требуемого размера curline = 1 ln ="" 'используем ln для посимвольного создания строк For i = 0 To charsInFile - 1 'снова организуем цикл по всему тексту letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки curline = curline + 1 'увеличиваем счетчик строк i += 1 'пропускаем символ перевода строки ln = "" 'очищаем строку и переходим к следующей Else ln = ln letter 'добавляем символ в строку strArray(curline) = ln 'и помещаем в массив End If Next i 'сортируем массив ShellSort(strArray, lineCount) 'затем отображаем отсортированный массив в текстовом поле txtNote.Text = "" curline = 1 For i = 1 To lineCount txtNote.Text = txtNote.Text _ strArray(curline) vbCrLf curline += 1 Next i txtNote.Select(1, 0) 'удаляем выделение текста
Массив strArray был объявлен в стандартном модуле (Module1.vb), который также является частью этой программы. С помощью оператора ReDim и переменной lineCount я задаю размер массива strArray как динамический. Этот оператор создает массив, который содержит число элементов, равное числу строк текста, содержащегося в текстовом поле (требование для процедуры ShellSort ). Используя цикл For и переменную ln, я снова сканирую текстовое поле, ищу символы возврата каретки, и копирую каждую найденную полную строку в strArray. После того, как массив заполняется текстом, я вызывают процедуру ShellSort, созданную ранее в стандартном модуле Module1.vb.
Отобразите в Редакторе кода стандартный модуль Module1.vb. Этот модуль объявляет открытую переменную массива strArray, а затем определяет содержимое процедуры ShellSort. Процедура ShellSort использует для сравнения элементов массива оператор сравнения <= и меняет местами все элементы, которые находятся в неправильном порядке. Эта процедура выглядит так:
Sub ShellSort(ByRef sort() As String, ByVal numOfElements As Short) Dim temp As String Dim i, j, span As Short 'Процедура ShellSort сортирует элементы массива sort() 'в нисходящем порядке и возвращает его в вызывающую процедуру. span = numOfElements \ 2 Do While span > 0 For i = span To numOfElements - 1 For j = (i - span + 1) To 1 Step -span If sort(j) <= sort(j + span) Then Exit For 'меняем местами элементы массива, расположенные не по 'порядку temp = sort(j) sort(j) = sort(j + span) sort(j + span) = temp Next j Next i span = span \ 2 Loop End Sub
Этот метод сортировки постоянно делит главный список элементов на подсписки, которые в два раза меньше. Затем сортировка сравнивает самые верхние и самые нижние элементы подсписков и проверяет, в правильном ли порядке они расположены. Если эти элементы расположены в неверном порядке, они меняются местами. Конечным результатом является массив с именем sort(), который отсортирован по алфавиту в нисходящем порядке. Чтобы изменить порядок сортировки, просто измените оператор сравнения на противоположный (измените <= на >=).
Перейдем к еще одной вариации на тему программы Quick Note, которая реализует базовое шифрование строк.
Теперь, когда у вас есть некоторый опыт работы с ASCII-кодами, вы можете писать простые процедуры шифрования, которые сдвигают ASCII-коды вашего документа и "кодируют" текст, чтобы скрыть его от посторонних глаз. Этот процесс, известный как шифрование, математически изменяет символы в файле, делая их нечитаемыми для случайного наблюдателя. Конечно, чтобы успешно использовать шифрование, вы также должны иметь возможность сделать обратное преобразование - в противном случае вы просто испортите ваши файлы вместо того, чтобы защитить их. Также необходимо создать такую схему шифрования, которую нельзя будет легко распознать. Это сложный процесс, который в примере программы для этой лекции только начинается.
Следующие упражнения демонстрируют, как безопасно шифровать и расшифровывать текстовые строки. Запустите программу Encrypt Text и посмотрите на простой алгоритм шифрования в действии.
В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем padua.txt. Когда вы сохраняете текстовый файл, программа изменяет ASCII-код и отображает результаты в текстовом поле, показанном ниже.

Если вы откроете этот файл в Microsoft Word или другом текстовом редакторе, то увидите тот же результат - для защиты от несанкционированного прочтения символы в файле были зашифрованы.
Чтобы восстановить файл в его первоначальном виде, выберите в меню Файл команду Открыть зашифрованный файл и откройте файл padua.txt из папки c:\vbnet03sbs\Гл.12. Снова появится файл в его оригинальном виде, показанный ниже.

В нижней части окна текстового поля вы можете увидеть один или два дополнительных символа, которые зависят от количества символов возврата каретки и/или перевода строки, которые вы ввели в конце документа.
Чтобы посмотреть код программы, выполняющей увиденное вами при работе с программой шифрование, откройте в Редакторе кода процедуру события mnuSaveAsItem_Click. Хотя эффект, который вы видели, может выглядеть несколько загадочно, это была довольно простая схема шифрования. С помощью функций Asc и Chr и цикла For я просто вычитал из ASCII-кода каждого символа из текстового поля некоторое число, а затем сохранял зашифрованную строку в указанном текстовом файле. Здесь приведена полная процедура события.
Dim Encrypt As String = "" Dim letter As Char Dim i, charsInFile As Short SaveFileDialog1.Filter = "Текстовые файлы (*.txt)¦*.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName <> "" Then 'сохраняем текст с помощью схемы шифрования (ASCII-код + 1) charsInFile = txtNote.Text.Length For i = 0 To charsInFile - 1 letter = txtNote.Text.Substring(i, 1) 'определяем ASCII-код и вычитаем из него единицу Encrypt = Encrypt Chr(Asc(letter) - 1) Next FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, Encrypt) 'копируем текст на диск FileClose(1) txtNote.Text = Encrypt txtNote.Select(1, 0) 'удаляем выделение текста mnuCloseItem.Enabled = True End If
Обратите особое внимание на оператор
Encrypt = Encrypt Chr(Asc(letter) - 1)
который определяет ASCII-код текущего символа, вычитает из него 1, преобразует ASCII-код обратно в символ и добавляет его к строке Encrypt.
Теперь, чтобы увидеть, как программа производит расшифровку, отобразите в Редакторе кода процедуру события mnuOpenItem_Click. Этот код программы почти идентичен тому, который связан с командой Сохранить зашифрованный файл как, но вместо того, чтобы вычитать из ASCII-кода каждого символа по единице, он эту единицу прибавляет. Вот полная процедура события mnuOpenItem_Click:
Dim AllText, LineOfText As String
Dim i, charsInFile As Short
Dim letter As Char
Dim Decrypt As String = ""
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Открыть
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью обработчика
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
LineOfText = LineInput(1)
'добавляем каждую строку в переменную AllText
AllText = AllText LineOfText vbCrLf
Loop
'теперь расшифровываем строку, вычитая единицу из ASCII-кода
charsInFile = AllText.Length 'получаем длину строки
For i = 0 To charsInFile- 1 'перебираем в цикле все символы
letter = AllText.Substring(i, 1) 'получаем символ
Decrypt = Decrypt Chr(Asc(letter) + 1) 'прибавляем 1
Next I 'и создаем новую строку
txtNote.Text = Decrypt 'затем отображаем преобразованную строку
lblNote.Text = OpenFileDialog1.FileName
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Закрыть
mnuOpenItem.Enabled = False 'отключаем команду Открыть
Catch
MsgBox("Ошибка открытия файла. Возможно, файл слишком большой.")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Этот тип простого шифрования может быть именно тем, что вам требуется для
Описанная выше схема шифрования довольно безопасна для текстовых файлов, так как она сдвигает значение ASCII-кода символа на единицу. Однако если вы храните результат шифрования в виде текста в текстовом файле, то будьте осторожны при сдвиге ASCII-кодов более чем на несколько символов. Помните, что сильный сдвиг ASCII-кодов (такой, как добавление к каждому символу числа 500) не даст реальных символов ASCII, которые в дальнейшем могут быть расшифрованы. Например, добавление 500 к ASCII-коду буквы "A" (65) даст в результате 565. Это значение не может быть преобразовано в символ с помощью функции Chr и приведет к возникновению ошибки.
Безопасным обходом этой проблемы является преобразование при шифровании вашего файла букв в числа таким образом, что вы сможете обратить шифрование, не зависимо от того, на сколько большое (или маленькое) число взято. Если вы последуете этой линии рассуждений, то сможете применить к числам математические функции - умножение, логарифмы и т.д. - до тех пор, пока вы будете точно знать, как вернуть первоначальный текст.
Одно из наилучших инструментов для шифрования числовых значений уже встроено в Visual Basic. Этим инструментом является оператор Xor, который выполняет операцию "исключающее или" - функцию, выполняемую с битами, из которых состоит число. Оператор Xor можно изучить с помощью простой функции MsgBox. Например, оператор программы
MsgBox(Asc("A") Xor 50)
отобразит при его выполнении компилятором Visual Basic в окне сообщения числовой результат 115. Точно также, оператор программы
MsgBox(115 Xor 50)
отобразит в окне сообщения результат 65, являющийся ASCII-кодом буквы "A" (наше оригинальное значение). Другими словами, оператор Xor дает результат, который может быть обращен - если снова использовать для результата первой операции оригинальный код Xor. Такое поведение функции Xor используется во многих популярных алгоритмах шифрования. Оно может усложнить расшифровку ваших секретных файлов.
Теперь запустите программу Xor Encryption и посмотрите, как работает оператор Xor в созданной вами утилите создания заметок.
Введите для шифрования текстового файла следующий текст (или ваш собственный):
Указ Ротара (Ломбардия, Италия, около 643 г.) 296. О краже винограда. Тот, кто возьмет с лозы другого человека более трех гроздей винограда, должен уплатить в качестве компенсации шесть сольдо. Тот, кто возьмет меньше трех, не несет никакого наказания.
Введите 500 или любой другой числовой код, а затем нажмите на (Enter), как показано ниже.

Visual Basic шифрует текст с помощью оператора Xor и сохраняет его на диск как набор чисел. На экране вы не увидите никаких изменений, но будьте уверены, что программа создала на диске зашифрованный файл. (В этом можно убедиться с помощью текстового процессора или текстового редактора.)
Введите в появившемся диалоговом окне кода шифрования число 500, а затем щелкните на OK. (Если вы использовали другой код шифрования, то введите его.) Программа открывает файл и восстанавливает текст с помощью оператора Xor и указанного вами кода шифрования.

Оператор Xor используется как в процедуре события mnuSaveAsItem_Click, так и в процедуре события mnuOpenItem_Click. К настоящему моменту эти общие процедуры обработки меню должны быть вам знакомы. Процедура события mnuSaveAsItem_Click содержит следующие операторы программы:
Dim letter As Char
Dim strCode As String
Dim i, charsInFile, Code As Short
SaveFileDialog1.Filter = "Текстовые файлы (*.txt)|*.txt"
SaveFileDialog1.ShowDialog()
If SaveFileDialog1.FileName <> "" Then
strCode = InputBox("Введите ключ шифрования")
If strCode = "" Then Exit Sub 'если сделан щелчок на отмене
'сохраняем текст с помощью схемы шифрования
Code = CShort(strCode)
charsInFile = txtNote.Text.Length
FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output)
For i = 0 To charsInFile - 1
letter = txtNote.Text.Substring(i, 1)
'преобразуем в число с помощью Asc, а затем используем Xor для 'шифрования
Print(1, Asc(letter) Xor Code) 'и сохраняем в файле
Next
FileClose(1)
mnuCloseItem.Enabled = True
End If
В функции Print, использованной здесь впервые, оператор Xor используется для преобразования каждого символа из текстового поля в числовой код, который затем сохраняется на диск. (До сих пор в этой лекции я использовал функцию , которая копировала в файл целую строку, но в данном случае более целесообразно копировать по одному числу.)
Конечный результат этого шифрования получается не текстовым, а числовым - это поставит в тупик даже самого настойчивого шпиона. Например, следующая иллюстрация показывает зашифрованный файл, полученный в результате использования приведенной выше процедуры шифрования, открытый в блокноте Windows. Чтобы вы могли увидеть весь код, я включил опцию Word Wrap (Перенос по словам).

Процедура события mnuOpenItem_Click содержит следующие операторы программы:
Dim ch As Char
Dim strCode As String
Dim Code, Number As Short
Dim Decrypt As String = ""
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Open
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью обработчика
strCode = InputBox("Enter Encryption Code")
If strCode = "" Then Exit Sub 'если сделан щелчок на отмене
Code = CShort(strCode)
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
Input(1, Number) 'читаем зашифрованные числа
ch = Chr(Number Xor Code) 'преобразуем с помощью Xor
Decrypt = Decrypt ch 'и создаем строку
Loop
txtNote.Text = Decrypt 'затем отображаем преобразованную строку
lblNote.Text = OpenFileDialog1.FileName
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Close
mnuOpenItem.Enabled = False 'отключаем команду Open
Catch
MsgBox("Ошибка при открытии файла .")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Когда пользователь щелкает на команде Открыть зашифрованный файл , эта процедура события открывает зашифрованный файл, запрашивает у пользователя код шифрования и отображает в объекте текстового поля преобразованный файл. Функция Input, представленная здесь впервые, читает из зашифрованного файла по одному числу и сохраняет его в короткой целочисленной переменной Number. ( Input тесно связана с LineInput, но функция Input читает из файла только один символ, а не целую строку.) Затем переменная Number с помощью оператора Xor объединяется с переменной Code, а результат преобразуется с помощью функции Chr в символ. Затем эти символы (сохраненные в переменной ch типа Char ) объединяются со строковой переменной , которая хранит весь расшифрованный файл, как показано здесь:
ch = Chr(Number Xor Code) 'преобразуем с помощью Xor Decrypt = Decrypt ch 'и создаем строку
Техники шифрования, подобные этой, полезны и могут также использоваться в образовательных целях. Так как шифрование в большой степени основано на обработке строк, это хороший способ попрактиковаться в базовых и очень важных приемах программирования на Visual Basic. Только убедитесь, что вы не потеряете ваш ключ шифрования!
| Чтобы | Сделайте следующее |
|---|---|
| Открыть текстовый файл | Используйте функцию FileOpen. Например: FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) |
| Получить строку ввода из текстового файла | Используйте функцию LineInput. Например: Dim LineOfText As String LineOfText = LineInput(1) |
| Проверить, не достигнут ли конец файла | Используйте функцию EOF. Например: Dim LineOfText, AllText As String Do Until EOF(1) LineOfText = LineInput(1) AllText = AllText LineOfText _ vbCrLf Loop |
| Закрыть открытый файл | Используйте функцию FileClose. Например: FileClose(1) |
| Отобразить текстовый файл на экране | Используйте функцию LineInput для копирования текста из открытого файла в строковую переменную, а затем присвойте эту строковую переменную объекту текстового поля. Например: Dim AllText, LineOfText As String Do Until EOF(1) 'читаем строки из файла LineOfText = LineInput(1) AllText = AllText LineOfText _ vbCrLf Loop txtNote.Text = AllText ' отображаем файл |
| Отобразить диалоговое окно Open | Добавьте в вашу форму элемент управления OpenFileDialog, а затем используйте метод ShowDialog объекта диалога открытия файла. Например: OpenFileDialog1.ShowDialog() |
| Создать новый текстовый файл | Используйте функцию FileOpen. Например: FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) |
| Отобразить диалоговое окно Save As | Добавьте в форму элемент управления SaveFileDialog, а затем используйте метод ShowDialog объекта диалога сохранения файла. Например: SaveFileDialog1.ShowDialog() |
| Сохранить текст в файле | Используйте функцию Print или PrintLine(1, txtNote.Text) |
| Преобразовать символы текста в ASCII-коды | Используйте функцию Asc. Например: Dim Code As Short
Code = Asc("A") ' Code равна 65
|
| Преобразовать ASCII-коды в символы текста | Используйте функцию Chr. Например: Dim Letter As Char Letter = Chr(65) 'Letter равна "A" |
| Выделить символы из середины строки. | Используйте метод Substring или функцию Mid. Например: Dim Cols, Middle As String Cols = "Первая Вторая Третья" Middle = Cols.SubString(6, 6) 'Middle = "Вторая" |
| Зашифровать текст | Используйте оператор Xor и определяемый пользователем код шифрования. Например, этот блок кода использует Xor и код пользователя для шифрования текста из текстового поля strCode = InputBox("Введите код зашифрования")
Code = CShort(strCode)
charsInFile = txtNote.Text.Length
FileOpen(1, SaveFileDialog1.FileName, _
OpenMode.Output)
For i = 0 To charsInFile - 1
letter = txtNote.Text.Substring(i, 1)
Print(1, Asc(letter) Xor Code)
Next
FileClose(1)
|
| Расшифровать текст | Запросите у пользователя код, который он выбрал для шифрования текста и используйте Xor для расшифровки этого текста. Например, блок кода использует Xor и код пользователя для обращения шифрования, созданного в предыдущем примере: strCode = InputBox("Введите код расшифрования")
Code = CShort(strCode)
FileOpen(1, OpenFileDialog1.FileName, _
OpenMode.Input)
Do Until EOF(1)
Input(1, Number)
ch = Chr(Number Xor Code)
Decrypt = Decrypt ch
Loop
txtNote.Text = Decrypt
|
В этой лекции вы узнаете, как:
Управление электронными документами во многих сферах деятельности является очень важной задачей, и Microsoft Visual Basic .NET предоставляет различные механизмы для работы с различными типами документов и обработки их содержимого. Наиболее общим типом документов является текстовый файл, который состоит из неотформатированных слов и параграфов, букв, цифр и специальных символов различного назначения. В этой лекции вы узнаете, как работать с информацией, хранящейся в вашей системе в текстовых файлах. Вы узнаете, как открывать текстовый файл и отображать его содержимое с помощью объекта текстового поля и как создавать на диске новый текстовый файл. Вы также узнаете об управлении строками в вашей программе, и будете использовать методы, принадлежащие классу String из .NET Framework, чтобы объединять, шифровать и отображать слова, строки и целые текстовые файлы.
Open, Line Input #, Print #, EOF и Close. В Visual Basic .NET имеется новый набор функций, которые выполняют операции с текстовыми файлами. Эти функции предоставляются объектом FileSystem из пространства имен Microsoft.VisualBasic, и включают FileOpen, LineInput, PrintLine и FileClose.System.IO. Объекты в пространстве имен System.IO не заменяют приведенных ранее встроенных функций Visual Basic .NET, а дополняют их.String из .NET Framework. Например, новый метод SubString предоставляет функциональность, аналогичную функции Mid из Visual Basic, а метод ToUpper аналогичен функции UCase из Visual Basic. Для обработки текстов вы можете использовать любой из этих методов, но рекомендуется использовать более новые.Простейшим способом отображения в программе текстового файла является использование объекта текстового поля. Вы можете создать объекты текстового поля различного размера. Если содержимое текстового файла не помещается в текстовое поле, можно добавить к текстовому полю полосы прокрутки так, что пользователь сможет увидеть весь текст. Чтобы загрузить в текстовое поле содержимое текстового файла, необходимо использовать четыре функции. Эти функции описаны в следующей таблице и будут продемонстрированы в первом упражнении этой лекции. Некоторые из этих функций заменяют старые ключевые слова языка Visual Basic.
| Функция | Описание |
|---|---|
| FileOpen | Открывает текстовый файл для ввода или вывода |
| LineInput | Читает строку ввода из текстового файла |
| EOF | Проверяет на достижение конца текстового файла |
| FileClose | Закрывает текстовый файл |
Текстовый файл состоит из одной или более строк цифр, слов или символов. Текстовые файлы отличаются от файлов документов, которые содержат форматирующие коды, и от исполняемых файлов, которые содержат инструкции для операционной системы. Обычные текстовые файлы в вашей системе будут определяться проводником Microsoft Windows как "
Можно разрешить пользователю выбирать, какой текстовый файл в программе следует открыть. Это делается с помощью элемента управления OpenFileDialog, который спросит у пользователя путь к файлу. Элемент управления OpenFileDialog содержит свойство Filter, которое управляет тем, какой тип файлов в нем отображается, метод ShowDialog, который отображает диалоговое окно Open (Открыть), и свойство FileName, которое возвращает путь, указанный пользователем. Элемент управления OpenFileDialog не открывает файл, он просто предоставляет путь к нему.
Получив от пользователя путь, вы открываете в вашей программе файл с помощью функции FileOpen. Сокращенный синтаксис функции FileOpen имеет вид
FileOpen(номер_файла, путь, режим)
Полный список аргументов вы можете найти в справочной системе Visual Basic. Вот наиболее важные:
OpenMode.Input и OpenMode.Output.)Номер файла будет ассоциирован с файлом при его открытии. Затем вы будете использовать это число в вашем коде всегда, когда нужно будет сослаться на этот открытый файл. Кроме этой ассоциации есть еще один момент, касающийся этих чисел - Visual Basic использует их для отслеживания различных открываемых в вашей программе файлов.
Обычная функция FileOpen с использованием объекта OpenFileDialog выглядит так:
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Здесь свойство OpenFileDialog1.FileName представляет путь, OpenMode.Input - это режим, а 1 - это номер файла.
В следующем упражнении демонстрируется, как использовать для открытия текстового файла элемент управления OpenFileDialog и функцию FileOpen, а также функции LineInput и EOF для отображения содержимого текстового файла в текстовом поле и функцию FileClose для закрытия файла.
Если форма проекта не отображается, отобразите ее сейчас. Появится форма Просмотр текста, показанная ниже.

Эта форма содержит большое текстовое поле, которое имеет полосы прокрутки. Она также содержит главное меню (с командами Открыть, Закрыть и Выход ), диалог открытия файла и метку, которая выдает инструкции к действию. Я также создал установки свойств, показанные в следующей таблице. (Обратите особое внимание на установки текстового поля.)
| Объект | Свойство | Установка |
|---|---|---|
| txtNote | Enabled | False |
| Multiline | True | |
| Name | txtNote | |
| ScrollBars | Both | |
| Text | пустой (empty) | |
| mnuOpenItem | Name | mnuOpenItem |
| mnuCloseItem | Enabled | False |
| Name | mnuCloseItem | |
| lblNote | Text | "Загрузите текстовый файл с помощью команды Открыть" |
| Name | lblNote | |
| Form1 | Text | "Просмотр текста" |
Откройте папку c:\vbnet03sbs\Гл.12\text browser. Содержимое папки Text Browser показано здесь.

Сделайте двойной щелчок мышью на имени файла SocialStructure.txt. Как показано ниже, в текстовом поле появится SocialStructure - текстовый файл, содержащий статью, посвященную социальному расслоению общества.

Теперь посмотрите на две важных процедуры событий этой программы.
mnuOpenItem_Click.Если это необходимо, измените размер Редактора кода так, чтобы увидеть как можно больший фрагмент кода. Процедура события mnuOpenItem_Click содержит следующий код программы:
Dim AllText, LineOfText As String
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)¦*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Open
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью
' обработчика
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
LineOfText = LineInput(1)
'добавляем каждую строку в переменную AllText
AllText = AllText LineOfText vbCrLf
Loop
lblNote.Text = OpenFileDialog1.FileName 'обновляем метку
txtNote.Text = AllText ' отображаем файл
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Закрыть
mnuOpenItem.Enabled = False 'отключаем команду Открыть
Catch
MsgBox("Ошибка открытия файла.")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Эта процедура события выполняет следующие действия:
Filter диалога открытия файла.OpenFileDialog1 запрашивает у пользователя путь.Try...Catch перехватывает ошибки.FileOpen открывает указанный файл для ввода.LineInput для построчного копирования файла в строку с именем AllText.EOF ) или пока в строке не останется больше места. В AllText есть место для очень большого файла, но если в процессе копирования произойдет ошибка, блок Catch выведет сообщение об этой ошибке.AllText в текстовом поле, удаляет выделение и включает полосы прокрутки и текстовый курсор.Обновляет команды меню Файл и закрывает файл с помощью функции FileClose.
Потратьте некоторое время, чтобы понять, как работают операторы в процедуре события mnuOpenItem_Click - особенно функции FileOpen, LineInput, EOF и FileClose. Чтобы получить дополнительную информацию об этих операторах и функциях, выделите интересующее вас ключевое слово и нажмите (F1), чтобы увидеть его описание в справочной системе Visual Basic. При возникновении ошибки обработчик ошибок в этой процедуре отображает сообщение и прерывает процесс загрузки.
Отобразите процедуру события mnuCloseItem_Click, которая исполняется при щелчке на команде меню Закрыть. Процедура события mnuCloseItem_Click выглядит так:
txtNote.Text = "" 'очищаем текстовое поле lblNote.Text = "Загрузите текстовый файл с помощью команды Открыть." mnuCloseItem.Enabled = False 'отключаем команду Закрыть mnuOpenItem.Enabled = True 'включаем команду Открыть
Эта процедура очищает текстовое поле, обновляет метку lblNote, отключает команду Закрыть и включает команду Открыть.
Теперь вы можете использовать эту простую программу как шаблон для создания более продвинутых утилит для обработки текстовых файлов. В следующем разделе вы узнаете, как вводить в текстовое поле собственный текст, и как сохранять текст из текстового поля в файл на диске.
В дополнение к командам Visual Basic, которые открывают и отображают текстовые файлы, имеется новый класс StreamReader из библиотеки .NET Framework, который позволяет открывать и отображать в программах текстовые файлы. В этой книге я буду использовать для работы с текстовыми файлами как встроенные функции Visual Basic, так и класс StreamReader.
Чтобы использовать класс StreamReader, необходимо добавить в начало вашего кода следующий оператор Imports, который предоставляет доступ к классу StreamReader:
Imports System.IO
Затем, если ваша программа сдержит объект текстового поля, вы можете отобразить этот текстовый файл в этом текстовом поле с помощью следующего кода программы. (Текстовый файл, открывающийся в этом примере - это Readme.txt, и код предполагает, что в вашей форме создан объект с именем TextBox1.)
Dim StreamToDisplay As StreamReader
StreamToDisplay = New StreamReader("c:\vbnet03sbs\Гл.14\readme.txt")
TextBox1.Text = StreamToDisplay.ReadToEnd
StreamToDisplay.Close()
TextBox1.Select(0, 0)
StreamReader - это альтернативный по отношению к использованию функций Visual Basic способ открывать текстовый файл, предоставляемый .NET Framework. В этом примере использования StreamReader я объявляю переменную StreamToDisplay типа StreamReader, в которой хранится содержимое текстового файла, а затем указываю правильный путь к файлу, который я хочу открыть. Затем с помощью метода ReadToEnd, который получает из файла весь текст, начиная с текущей позиции (начало текстового фала) и до конца этого файла, я считываю содержимое текстового файла в переменную StreamToDisplay, и присваиваю ее свойству Text текстового поля. Последние операторы закрывают текстовый файл и используют метод Select для удаления выделения в текстовом поле.
Вы будете использовать эту запись StreamReader в лекции 15 в качестве альтернативы для встроенных в Visual Basic функций для работы с файлами.
Чтобы создать на диске новый текстовый файл с помощью Visual Basic, используется множество функций и ключевых слов, которые вы уже применяли в последнем примере. Создание новых файлов на диске и сохранение в них данных полезно, если вы планируете создавать собственные отчеты или журналы, сохранять важные вычисления или значения или создавать специальный текстовый процессор или текстовый редактор. Вот обзор шагов, которые вы должны сделать в такой программе:
InputForFile.SaveFileDialog запросите у пользователя путь к файлу. Для отображения этого диалогового окна вы используете метод ShowDialog.PrintLine .FileClose.В следующем упражнении демонстрируется, как можно использовать элементы управления TextBox и SaveFileDialog для построения простой утилиты создания заметок. Эта программа использует для открывания файла функцию FileOpen, для сохранения в нем данных - функцию , а для закрытия файла - функцию FileClose. Вы можете использовать этот инструмент дома или на работе для создания заметок, а затем привязки их к текущей дате.
Если форма проекта не отображается, отобразите ее сейчас. Появится форма Заметки, как показано на следующей иллюстрации. Она выглядит аналогично форме Просмотр текста. Однако я заменил в ней элемент управления OpenFileDialog на элемент управления SaveFileDialog. Меню Файл также содержит различные дополнительные команды, включая Сохранить как, Добавить дату и Выход.

Я установил следующие свойства этого проекта:
| Объект | Свойство | Установка |
|---|---|---|
| txtNote | Multiline | True |
| Name | txtNote | |
| ScrollBars | Both | |
| Text | пустой (empty) | |
| lblNote | Text | "Введите заметку, а затем сохраните ее на диск" |
| Form1 | Text | Заметки |
Введите в текстовое поле следующий или ваш собственный текст:
Принцип социальной мобильности
Это возможность перехода из одной общественной группы в другую, из одного класса в другой. Например:
Когда вы это сделаете, ваш экран должен выглядеть примерно так.

Теперь попробуйте использовать команды из меню Файл.
В меню Файл щелкните на команде Добавить дату. В первой строке текстового поля появится текущая дата, как показано ниже.

Команда Добавить дату предоставляет удобный способ включить в файл текущую дату. Это полезно, если вы создаете дневник или журнал.
Теперь посмотрите на процедуры событий этой программы.
В меню Файл программы Quick Note сделайте двойной щелчок мышью на команде Добавить дату. В Редакторе кода появится процедура события mnuInsertDateItem_Click. Вы увидите следующий программный код:
txtNote.Text = DateString vbCrLf txtNote.Text txtNote.Select(1, 0) 'удаление выделения
Эта процедура события добавляет в текстовое поле текущую дату (сгенерированную свойством DateString ), добавляя к ней символ возврата каретки (константу vbCrLf ) и значение свойства Text текстового поля. С помощью этой методики можно добавлять в текст, находящийся в текстовом поле, текущее время или любую другую информацию.
Задержитесь и посмотрите, как работают операторы конкатенации, а затем изучите в Редакторе кода процедуру события mnuSaveAsItem_Click. Вы увидите следующий программный код:
SaveFileDialog1.Filter = "Текстовые файлы (*.txt)¦*.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName <> "" Then FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, txtNote.Text) 'копируем текст на диск FileClose(1) End If
Этот блок операторов использует для отображения диалогового окна Сохранить как. Объект диалога сохранения файлов проверяет, выбрал ли пользователь файл, открывает этот файл для вывода как файл номер 1, записывает значение свойства txtNote.Text на диск с помощью функции , а затем закрывает этот текстовый файл. Обратите особое внимание на оператор
PrintLine(1, txtNote.Text) 'копируем текст на диск
который присваивает все содержимое текстового поля открытому файлу. аналогична старым операторам Visual Basic Print и Print # ; она направляет вывод в указанный файл, а не на экран или принтер. Здесь важно то, что весь файл сохраняется в свойстве txtNote.Text.
FileOpen, PrintLine и FileClose, а затем закройте программу с помощью команды Close Solution (Закрыть решение) из меню File (Файл).Вы закончили работу с программой Quick Note.
С помощью элемента управления TextBox и набора специальных операторов программы можно быстро открывать, редактировать и сохранять текстовые файлы на диск. Visual Basic также предоставляет несколько мощных операторов и функций, специально предназначенных для обработки в программах текстовых элементов. В этом разделе вы узнаете, как извлекать из текстовой строки полезную информацию, копировать список строк в массив и сортировать список строк.
Возможность сортировать набор строк очень полезна при работе с текстовыми элементами. Базовые концепции сортировки просты. Вы составляете список сортируемых элементов, а затем сравниваете элементы друг с другом и переставляете их до тех пор, пока список не окажется отсортированным по алфавиту в восходящем или нисходящем порядке. В Visual Basic вы можете производить сравнение одной строки с другой с помощью тех же операторов сравнения, которые вы используете для сравнения числовых значений. Фокус (который иногда вызывает длинные дискуссии среди компьютерных специалистов) здесь состоит в конкретном алгоритме сортировки, который вы используете для сравнения элементов списка. Мы не будем в этой лекции вдаваться в детали достоинств и недостатков различных алгоритмов сортировки. (Яблоком раздора обычно является скорость, которая имеет значение только тогда, когда сортируются несколько тысяч элементов.) Вместо этого мы изучим, как при сортировке производится базовое сравнение строк. По ходу дела вы узнаете о способах сортировки ваших собственных текстовых полей, полей списков, файлов и баз данных.
До сих пор при работе со строками чаще всего использовалась конкатенация их с помощью оператора конкатенации (). Например, следующий оператор программы производит конкатенацию трех символьных выражений и присваивает результат "Все в сад!" строковой переменной Slogan:
Dim Slogan As String Slogan = "Все" " в " "сад!"
Также можно производить конкатенацию и обрабатывать строки с помощью методов из класса String библиотеки .NET Framework. Например, метод String.Concat позволяет выполнить эквивалентную конкатенацию строк с помощью такой записи:
Dim Slogan As String
Slogan = String.Concat("Все", " в ", "сад!")
Соответственно, в Visual Basic .NET существует два метода для конкатенации строк и других задач по их обработке: можно использовать операторы и функции из более ранних версий Visual Basic ( Mid, UCase, LCase и т.д.), а можно новые методы из .NET Framework ( Substring, ToUpper, ToLower и т.д.). Никаких реальных ограничений на использование любой из этих методик не существует. В оставшейся части этой лекции представлено несколько полезных функций для обработки строк из класса String библиотеки .NET Framework, но иногда я буду использовать также и более старые
Следующая таблица содержит список методов .NET Framework, которые используются в последующих упражнениях, и их ближайшие эквиваленты из языка программирования Visual Basic .NET. В четвертом столбце этой таблицы приводится пример кода для методов класса String из библиотеки .NET Framework.
| Метод .NET Framework | Функция Visual Basic | Описание | Пример для .NET Framework |
|---|---|---|---|
ToUpper |
UCase |
Изменяет регистр букв строки на верхний | Dim Name, NewName As String Name = "Kim" NewName = Name.ToUpper 'NewName = "KIM" |
ToLower |
LCase |
Изменяет регистр букв строки на нижний | Dim Name, NewName As String Name = "Kim" NewName = Name.ToLower 'NewName = "kim" |
Length |
Len |
Определяет число символов в строке | Dim River As String Dim Size As Short River = "Mississippi" Size = River.Lengh 'Size = 11 |
Substring |
Mid |
Возвращает фиксированное число символов строки, начиная с заданной начальной позиции. (Примечание: первый элемент строки имеет индекс 0.) | Dim Cols, Middle As String Cols = "First Second Third" Middle = Cols.SubString (6, 6) |
IndexOf |
InStr |
Ищет точку вхождения одной строки в другой, более длинной | Dim Name As String
Dim Start As Short
Name = "Abraham"
Start = Name.IndexOf("h")
'Start = 4
|
Trim |
Trim |
Удаляет из строки "ведущие" и последующие пробелы | Dim Spacey, Trimmed As String Spacey = "Hello" Trimmed = Spacey.Trim 'Trimmed = "Hello" |
Remove |
Удаляет символы из середины строки | Dim RawStr, CleanStr As String RawStr = "Helli3333 there!" CleanStr = RawStr.Remove(5,3) 'CleanStr = "Hello there" |
|
Insert |
Добавляет символы в середину строки | DimOldstr, NewStr As String Oldstr = "Hi Felix" NewStr = OldStr.Insert(3, "there") 'NewStr = "Hi there Felix" |
|
StrComp |
Сравнивает строки, не обращая внимания на регистр | Dim str1 As Strng = "Soccer" Dim str2 As Strng = "SOCCER" Dim Match As Short Match = StrComp (str1, str2, CompareMethod.Text) 'Math = 0[string match] |
Прежде, чем Visual Basic сможет при сортировке сравнить один символ с другим, он должен преобразовать каждый из символов в число с помощью таблицы перевода, которая называется таблицей символов
В 1980-е годы IBM расширила ASCII кодами 128-255, которые содержали символы национальных языков, греческие символы, символы псевдографики и некоторые другие. ASCII и эти дополнительные символы обычно называются расширенной таблицей символов IBM.
Набор символов ASCII до сих пор является наиболее важным из изучаемых начинающими программистами набором кодов, но он не единственный. При расширении рынка компьютеров и прикладного программного обеспечения был разработан более сложный стандарт представления символов, который называется Unicode. Unicode может хранить до 65536 символов - вполне достаточно для того, чтобы представить традиционные символы набора ASCII и многочисленные международные символы. (На момент написания этого текста определено около 45000 символов.) Группа по поддержке этого стандарта создает набор символов Unicode и периодически добавляет в него новые символы. Microsoft Windows NT, Windows 2000, Windows XP, Windows Server 2003 и Visual Basic .NET были специально разработаны с поддержкой наборов символов ASCII и Unicode.
В следующих разделах пойдет речь об использовании набора символов ASCII для обработки строк. Когда ваши приложения станут более сложными, и вы начнете планировать глобальную дистрибуцию вашего программного обеспечения, вам понадобится узнать больше о Unicode и других международных установках.
Чтобы определить ASCII-код конкретной буквы, вы можете использовать функцию Asc из Visual Basic. Например, следующий оператор программы присваивает короткой целочисленной переменной AscCode число 122 (ASCII-код строчной буквы "z"):
Dim AscCode As Short
AscCode = Asc("z")
Точно так же, с помощью функции Chr можно преобразовать ASCII-код в букву. Например, этот оператор программы присваивает символьной переменной букву "z":
Dim letter As Char letter = Chr(122)
Такой же результат можно получить, если вы будете использовать только что объявленную переменную AscCode:
letter = Chr(AscCode)
Как можно сравнить одну текстовую строку или ASCII-код с другой? Вы просто должны использовать один из операторов сравнения, предоставляемых Visual Basic для работы с текстовыми и числовыми элементами. Эти операторы сравнения приведены в следующей таблице:
| Оператор | Значение |
|---|---|
| <> | Не равно |
| = | Равно |
| < | Меньше, чем |
| > | Больше, чем |
| <= | Меньше или равно |
| >= | Больше или равно |
Символ "больше, чем" другой символ, если его ASCII-код больше. Например, значение ASCII буквы "Б" больше, чем значение ASCII буквы "A", так что выражение
"A" < "Б"
истинно, а выражение
"A" > "Б"
ложно.
При сравнении двух строк, которые содержат больше одного символа, Visual Basic начинает со сравнения первого символа в первой строке с первым символом во второй строке, а затем продолжает посимвольное сравнение этих строк до тех пор, пока не найдет различие. Например, строки Mike и Michael одинаковы до третьего символа ("k" и "c"). Так как значение ASCII "k" больше, чем значение "c", выражение
"Mike" > "Michael"
истинно.
Если между строками не найдено различий, то они равны. Если две строки равны на протяжении нескольких символов, но одна строка продолжается, а вторая заканчивается, то более длинная строка больше, чем более короткая. Например, выражение
"AAAAA" > "AAA"
истинно.
В следующем упражнении демонстрируется, как можно использовать операторы сравнения и некоторые строковые методы и функции для сортировки строк текста в текстовом поле. Программа является доработанной версией утилиты Quick Note и содержит команду Открыть, которая позволяет открывать существующий файл, и команду Закрыть, которая закрывает этот файл. Также в ней имеется команда Сортировка текста в меню Файл, которую вы можете использовать для сортировки текста, отображаемого в настоящий момент в текстовом поле.
Так как все содержимое текстового поля хранится в одной строке, вначале программа должна разбить эту длинную строку на более короткие отдельные строки. Затем эти строки можно отсортировать с помощью Sub-процедуры ShellSort - процедуры сортировки по алгоритму, созданному в 1959 году Дональдом Шеллом. Чтобы упростить эту задачу, я создал стандартный модуль, который определяет динамический строковый массив, который будет хранить каждую из строк текстового поля. Я также поместил в этот стандартный модуль процедуру ShellSort, так что я могу вызывать ее из любой процедуры события проекта. (Подробнее о стандартных модулях см. в лекции 10.)
Одним из интересных моментов этой программы является процедура, которая определяет число строк в объекте текстового поля. В Visual Basic нет функции, которая бы автоматически вычисляла это значение. Я хотел, чтобы программа смогла построчно сортировать текстовое поле любого размера. Для этого я создал код, имеющий следующий вид. Он использует метод Substring для поиска в объекте текстового поля единственного символа, а затем функцию Chr для поиска символа возврата каретки (чей ASCII-код равен 13), стоящего в конце каждой строки. (Особенно обратите внимание на то, как в качестве части свойства Text объекта txtNote используется метод Substring - класс String автоматически предоставляет этот метод, а также многие другие для любых свойств или переменных, которые объявлены как имеющие тип String.)
Dim ln, curline, letter As String Dim i, charsInFile, lineCount As Short 'определяем число строк объекта текстового поля (txtNote) lineCount = 0 'эта переменная содержит общее количество строк charsInFile = txtNote.Text.Length 'получаем общее число символов For i = 0 To charsInFile (Файл) - 1 'берем по одному символу за раз letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки lineCount += 1 'переходим на следующую строку (увеличиваем счетчик) i += 1 'пропускаем символ перевода строки (всегда следует 'за возвратом каретки) End If Next i
Общее число строк в текстовом поле присваивается короткой целой переменной lineCount. Далее в программе это значение используется для задания размера динамического массива, который хранит все строки по отдельности. Затем окончательный массив строк передается в процедуру ShellSort для сортировки, и ShellSort возвращает строковый массив, отсортированный по алфавиту. Когда строковый массив отсортирован, я просто копирую его в цикле For обратно в текстовое поле.
Введите в текстовое поле следующий или какой-нибудь собственный текст:
Зебра Горилла Луна Банан Яблоко Черепаха
Убедитесь, что после слова Черепаха или вашей собственной последней строки вы ввели (Enter), иначе Visual Basic не сможет корректно рассчитать число строк.
В меню Файл щелкните на команде Сортировка текста. Только что введенный вами текст будет отсортирован и снова выведен в текстовое поле, как показано ниже.

Щелкните на команде Открыть из меню Файл и откройте файл abc.txt, расположенный в папке c:\vbnet03sbs\Гл.12, как показано ниже.

Файл abc.txt содержит 24 строки текста. Каждая строка начинается либо с буквы, либо с цифры (1-10).
Чтобы отсортировать содержимое файла abc.txt, щелкните в меню Файл на команде Сортировка текста. Программа Sort Text отсортирует файл в алфавитном порядке и отобразит отсортированные строки в текстовом поле, как показано ниже.

Откройте Редактор кода и отобразите код процедуры события mnuSortTextItem_Click. Мы уже обсуждали первую часть этой процедуры события, которая с помощью метода Substring подсчитывает число строк в текстовом поле и ищет коды возврата каретки. Остальная часть процедуры события задает размерность строкового массива, копирует в этот массив все строки текста, вызывает процедуру для сортировки массива и отображает переупорядоченный список в текстовом поле. Полная процедура события mnuSortTextItem_Click выглядит так:
Dim ln, curline, letter As String Dim i, charsInFile, lineCount As Short 'определяем число строк объекта текстового поля (txtNote) lineCount = 0 'эта переменная содержит общее количество строк charsInFile = txtNote.Text.Length 'получаем общее число символов For i = 0 To charsInFile - 1 'берем по одному символу letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки lineCount += 1 'переходим на следующую строку (увеличиваем счетчик) i += 1 'пропускаем символ перевода строки (всегда следует за возвратом 'каретки) End If Next i 'создаем массив для хранения текста из текстового поля ReDim strArray(lineCount) 'создаем массив требуемого размера curline = 1 ln ="" 'используем ln для посимвольного создания строк For i = 0 To charsInFile - 1 'снова организуем цикл по всему тексту letter = txtNote.Text.Substring(i, 1) 'получаем символ If letter = Chr(13) Then 'если нашли возврат каретки curline = curline + 1 'увеличиваем счетчик строк i += 1 'пропускаем символ перевода строки ln = "" 'очищаем строку и переходим к следующей Else ln = ln letter 'добавляем символ в строку strArray(curline) = ln 'и помещаем в массив End If Next i 'сортируем массив ShellSort(strArray, lineCount) 'затем отображаем отсортированный массив в текстовом поле txtNote.Text = "" curline = 1 For i = 1 To lineCount txtNote.Text = txtNote.Text _ strArray(curline) vbCrLf curline += 1 Next i txtNote.Select(1, 0) 'удаляем выделение текста
Массив strArray был объявлен в стандартном модуле (Module1.vb), который также является частью этой программы. С помощью оператора ReDim и переменной lineCount я задаю размер массива strArray как динамический. Этот оператор создает массив, который содержит число элементов, равное числу строк текста, содержащегося в текстовом поле (требование для процедуры ShellSort ). Используя цикл For и переменную ln, я снова сканирую текстовое поле, ищу символы возврата каретки, и копирую каждую найденную полную строку в strArray. После того, как массив заполняется текстом, я вызывают процедуру ShellSort, созданную ранее в стандартном модуле Module1.vb.
Отобразите в Редакторе кода стандартный модуль Module1.vb. Этот модуль объявляет открытую переменную массива strArray, а затем определяет содержимое процедуры ShellSort. Процедура ShellSort использует для сравнения элементов массива оператор сравнения <= и меняет местами все элементы, которые находятся в неправильном порядке. Эта процедура выглядит так:
Sub ShellSort(ByRef sort() As String, ByVal numOfElements As Short) Dim temp As String Dim i, j, span As Short 'Процедура ShellSort сортирует элементы массива sort() 'в нисходящем порядке и возвращает его в вызывающую процедуру. span = numOfElements \ 2 Do While span > 0 For i = span To numOfElements - 1 For j = (i - span + 1) To 1 Step -span If sort(j) <= sort(j + span) Then Exit For 'меняем местами элементы массива, расположенные не по 'порядку temp = sort(j) sort(j) = sort(j + span) sort(j + span) = temp Next j Next i span = span \ 2 Loop End Sub
Этот метод сортировки постоянно делит главный список элементов на подсписки, которые в два раза меньше. Затем сортировка сравнивает самые верхние и самые нижние элементы подсписков и проверяет, в правильном ли порядке они расположены. Если эти элементы расположены в неверном порядке, они меняются местами. Конечным результатом является массив с именем sort(), который отсортирован по алфавиту в нисходящем порядке. Чтобы изменить порядок сортировки, просто измените оператор сравнения на противоположный (измените <= на >=).
Перейдем к еще одной вариации на тему программы Quick Note, которая реализует базовое шифрование строк.
Теперь, когда у вас есть некоторый опыт работы с ASCII-кодами, вы можете писать простые процедуры шифрования, которые сдвигают ASCII-коды вашего документа и "кодируют" текст, чтобы скрыть его от посторонних глаз. Этот процесс, известный как шифрование, математически изменяет символы в файле, делая их нечитаемыми для случайного наблюдателя. Конечно, чтобы успешно использовать шифрование, вы также должны иметь возможность сделать обратное преобразование - в противном случае вы просто испортите ваши файлы вместо того, чтобы защитить их. Также необходимо создать такую схему шифрования, которую нельзя будет легко распознать. Это сложный процесс, который в примере программы для этой лекции только начинается.
Следующие упражнения демонстрируют, как безопасно шифровать и расшифровывать текстовые строки. Запустите программу Encrypt Text и посмотрите на простой алгоритм шифрования в действии.
В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем padua.txt. Когда вы сохраняете текстовый файл, программа изменяет ASCII-код и отображает результаты в текстовом поле, показанном ниже.

Если вы откроете этот файл в Microsoft Word или другом текстовом редакторе, то увидите тот же результат - для защиты от несанкционированного прочтения символы в файле были зашифрованы.
Чтобы восстановить файл в его первоначальном виде, выберите в меню Файл команду Открыть зашифрованный файл и откройте файл padua.txt из папки c:\vbnet03sbs\Гл.12. Снова появится файл в его оригинальном виде, показанный ниже.

В нижней части окна текстового поля вы можете увидеть один или два дополнительных символа, которые зависят от количества символов возврата каретки и/или перевода строки, которые вы ввели в конце документа.
Чтобы посмотреть код программы, выполняющей увиденное вами при работе с программой шифрование, откройте в Редакторе кода процедуру события mnuSaveAsItem_Click. Хотя эффект, который вы видели, может выглядеть несколько загадочно, это была довольно простая схема шифрования. С помощью функций Asc и Chr и цикла For я просто вычитал из ASCII-кода каждого символа из текстового поля некоторое число, а затем сохранял зашифрованную строку в указанном текстовом файле. Здесь приведена полная процедура события.
Dim Encrypt As String = "" Dim letter As Char Dim i, charsInFile As Short SaveFileDialog1.Filter = "Текстовые файлы (*.txt)¦*.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName <> "" Then 'сохраняем текст с помощью схемы шифрования (ASCII-код + 1) charsInFile = txtNote.Text.Length For i = 0 To charsInFile - 1 letter = txtNote.Text.Substring(i, 1) 'определяем ASCII-код и вычитаем из него единицу Encrypt = Encrypt Chr(Asc(letter) - 1) Next FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) PrintLine(1, Encrypt) 'копируем текст на диск FileClose(1) txtNote.Text = Encrypt txtNote.Select(1, 0) 'удаляем выделение текста mnuCloseItem.Enabled = True End If
Обратите особое внимание на оператор
Encrypt = Encrypt Chr(Asc(letter) - 1)
который определяет ASCII-код текущего символа, вычитает из него 1, преобразует ASCII-код обратно в символ и добавляет его к строке Encrypt.
Теперь, чтобы увидеть, как программа производит расшифровку, отобразите в Редакторе кода процедуру события mnuOpenItem_Click. Этот код программы почти идентичен тому, который связан с командой Сохранить зашифрованный файл как, но вместо того, чтобы вычитать из ASCII-кода каждого символа по единице, он эту единицу прибавляет. Вот полная процедура события mnuOpenItem_Click:
Dim AllText, LineOfText As String
Dim i, charsInFile As Short
Dim letter As Char
Dim Decrypt As String = ""
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Открыть
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью обработчика
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
LineOfText = LineInput(1)
'добавляем каждую строку в переменную AllText
AllText = AllText LineOfText vbCrLf
Loop
'теперь расшифровываем строку, вычитая единицу из ASCII-кода
charsInFile = AllText.Length 'получаем длину строки
For i = 0 To charsInFile- 1 'перебираем в цикле все символы
letter = AllText.Substring(i, 1) 'получаем символ
Decrypt = Decrypt Chr(Asc(letter) + 1) 'прибавляем 1
Next I 'и создаем новую строку
txtNote.Text = Decrypt 'затем отображаем преобразованную строку
lblNote.Text = OpenFileDialog1.FileName
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Закрыть
mnuOpenItem.Enabled = False 'отключаем команду Открыть
Catch
MsgBox("Ошибка открытия файла. Возможно, файл слишком большой.")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Этот тип простого шифрования может быть именно тем, что вам требуется для
Описанная выше схема шифрования довольно безопасна для текстовых файлов, так как она сдвигает значение ASCII-кода символа на единицу. Однако если вы храните результат шифрования в виде текста в текстовом файле, то будьте осторожны при сдвиге ASCII-кодов более чем на несколько символов. Помните, что сильный сдвиг ASCII-кодов (такой, как добавление к каждому символу числа 500) не даст реальных символов ASCII, которые в дальнейшем могут быть расшифрованы. Например, добавление 500 к ASCII-коду буквы "A" (65) даст в результате 565. Это значение не может быть преобразовано в символ с помощью функции Chr и приведет к возникновению ошибки.
Безопасным обходом этой проблемы является преобразование при шифровании вашего файла букв в числа таким образом, что вы сможете обратить шифрование, не зависимо от того, на сколько большое (или маленькое) число взято. Если вы последуете этой линии рассуждений, то сможете применить к числам математические функции - умножение, логарифмы и т.д. - до тех пор, пока вы будете точно знать, как вернуть первоначальный текст.
Одно из наилучших инструментов для шифрования числовых значений уже встроено в Visual Basic. Этим инструментом является оператор Xor, который выполняет операцию "исключающее или" - функцию, выполняемую с битами, из которых состоит число. Оператор Xor можно изучить с помощью простой функции MsgBox. Например, оператор программы
MsgBox(Asc("A") Xor 50)
отобразит при его выполнении компилятором Visual Basic в окне сообщения числовой результат 115. Точно также, оператор программы
MsgBox(115 Xor 50)
отобразит в окне сообщения результат 65, являющийся ASCII-кодом буквы "A" (наше оригинальное значение). Другими словами, оператор Xor дает результат, который может быть обращен - если снова использовать для результата первой операции оригинальный код Xor. Такое поведение функции Xor используется во многих популярных алгоритмах шифрования. Оно может усложнить расшифровку ваших секретных файлов.
Теперь запустите программу Xor Encryption и посмотрите, как работает оператор Xor в созданной вами утилите создания заметок.
Введите для шифрования текстового файла следующий текст (или ваш собственный):
Указ Ротара (Ломбардия, Италия, около 643 г.) 296. О краже винограда. Тот, кто возьмет с лозы другого человека более трех гроздей винограда, должен уплатить в качестве компенсации шесть сольдо. Тот, кто возьмет меньше трех, не несет никакого наказания.
Введите 500 или любой другой числовой код, а затем нажмите на (Enter), как показано ниже.

Visual Basic шифрует текст с помощью оператора Xor и сохраняет его на диск как набор чисел. На экране вы не увидите никаких изменений, но будьте уверены, что программа создала на диске зашифрованный файл. (В этом можно убедиться с помощью текстового процессора или текстового редактора.)
Введите в появившемся диалоговом окне кода шифрования число 500, а затем щелкните на OK. (Если вы использовали другой код шифрования, то введите его.) Программа открывает файл и восстанавливает текст с помощью оператора Xor и указанного вами кода шифрования.

Оператор Xor используется как в процедуре события mnuSaveAsItem_Click, так и в процедуре события mnuOpenItem_Click. К настоящему моменту эти общие процедуры обработки меню должны быть вам знакомы. Процедура события mnuSaveAsItem_Click содержит следующие операторы программы:
Dim letter As Char
Dim strCode As String
Dim i, charsInFile, Code As Short
SaveFileDialog1.Filter = "Текстовые файлы (*.txt)|*.txt"
SaveFileDialog1.ShowDialog()
If SaveFileDialog1.FileName <> "" Then
strCode = InputBox("Введите ключ шифрования")
If strCode = "" Then Exit Sub 'если сделан щелчок на отмене
'сохраняем текст с помощью схемы шифрования
Code = CShort(strCode)
charsInFile = txtNote.Text.Length
FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output)
For i = 0 To charsInFile - 1
letter = txtNote.Text.Substring(i, 1)
'преобразуем в число с помощью Asc, а затем используем Xor для 'шифрования
Print(1, Asc(letter) Xor Code) 'и сохраняем в файле
Next
FileClose(1)
mnuCloseItem.Enabled = True
End If
В функции Print, использованной здесь впервые, оператор Xor используется для преобразования каждого символа из текстового поля в числовой код, который затем сохраняется на диск. (До сих пор в этой лекции я использовал функцию , которая копировала в файл целую строку, но в данном случае более целесообразно копировать по одному числу.)
Конечный результат этого шифрования получается не текстовым, а числовым - это поставит в тупик даже самого настойчивого шпиона. Например, следующая иллюстрация показывает зашифрованный файл, полученный в результате использования приведенной выше процедуры шифрования, открытый в блокноте Windows. Чтобы вы могли увидеть весь код, я включил опцию Word Wrap (Перенос по словам).

Процедура события mnuOpenItem_Click содержит следующие операторы программы:
Dim ch As Char
Dim strCode As String
Dim Code, Number As Short
Dim Decrypt As String = ""
OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Open
If OpenFileDialog1.FileName <> "" Then
Try 'открываем файл и перехватываем все ошибки с помощью обработчика
strCode = InputBox("Enter Encryption Code")
If strCode = "" Then Exit Sub 'если сделан щелчок на отмене
Code = CShort(strCode)
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
Do Until EOF(1) 'читаем строки из файла
Input(1, Number) 'читаем зашифрованные числа
ch = Chr(Number Xor Code) 'преобразуем с помощью Xor
Decrypt = Decrypt ch 'и создаем строку
Loop
txtNote.Text = Decrypt 'затем отображаем преобразованную строку
lblNote.Text = OpenFileDialog1.FileName
txtNote.Select(1, 0) 'удаляем выделение текста
txtNote.Enabled = True 'включаем текстовый курсор
mnuCloseItem.Enabled = True 'включаем команду Close
mnuOpenItem.Enabled = False 'отключаем команду Open
Catch
MsgBox("Ошибка при открытии файла .")
Finally
FileClose(1) 'закрываем файл
End Try
End If
Когда пользователь щелкает на команде Открыть зашифрованный файл , эта процедура события открывает зашифрованный файл, запрашивает у пользователя код шифрования и отображает в объекте текстового поля преобразованный файл. Функция Input, представленная здесь впервые, читает из зашифрованного файла по одному числу и сохраняет его в короткой целочисленной переменной Number. ( Input тесно связана с LineInput, но функция Input читает из файла только один символ, а не целую строку.) Затем переменная Number с помощью оператора Xor объединяется с переменной Code, а результат преобразуется с помощью функции Chr в символ. Затем эти символы (сохраненные в переменной ch типа Char ) объединяются со строковой переменной , которая хранит весь расшифрованный файл, как показано здесь:
ch = Chr(Number Xor Code) 'преобразуем с помощью Xor Decrypt = Decrypt ch 'и создаем строку
Техники шифрования, подобные этой, полезны и могут также использоваться в образовательных целях. Так как шифрование в большой степени основано на обработке строк, это хороший способ попрактиковаться в базовых и очень важных приемах программирования на Visual Basic. Только убедитесь, что вы не потеряете ваш ключ шифрования!
| Чтобы | Сделайте следующее |
|---|---|
| Открыть текстовый файл | Используйте функцию FileOpen. Например: FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) |
| Получить строку ввода из текстового файла | Используйте функцию LineInput. Например: Dim LineOfText As String LineOfText = LineInput(1) |
| Проверить, не достигнут ли конец файла | Используйте функцию EOF. Например: Dim LineOfText, AllText As String Do Until EOF(1) LineOfText = LineInput(1) AllText = AllText LineOfText _ vbCrLf Loop |
| Закрыть открытый файл | Используйте функцию FileClose. Например: FileClose(1) |
| Отобразить текстовый файл на экране | Используйте функцию LineInput для копирования текста из открытого файла в строковую переменную, а затем присвойте эту строковую переменную объекту текстового поля. Например: Dim AllText, LineOfText As String Do Until EOF(1) 'читаем строки из файла LineOfText = LineInput(1) AllText = AllText LineOfText _ vbCrLf Loop txtNote.Text = AllText ' отображаем файл |
| Отобразить диалоговое окно Open | Добавьте в вашу форму элемент управления OpenFileDialog, а затем используйте метод ShowDialog объекта диалога открытия файла. Например: OpenFileDialog1.ShowDialog() |
| Создать новый текстовый файл | Используйте функцию FileOpen. Например: FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) |
| Отобразить диалоговое окно Save As | Добавьте в форму элемент управления SaveFileDialog, а затем используйте метод ShowDialog объекта диалога сохранения файла. Например: SaveFileDialog1.ShowDialog() |
| Сохранить текст в файле | Используйте функцию Print или PrintLine(1, txtNote.Text) |
| Преобразовать символы текста в ASCII-коды | Используйте функцию Asc. Например: Dim Code As Short
Code = Asc("A") ' Code равна 65
|
| Преобразовать ASCII-коды в символы текста | Используйте функцию Chr. Например: Dim Letter As Char Letter = Chr(65) 'Letter равна "A" |
| Выделить символы из середины строки. | Используйте метод Substring или функцию Mid. Например: Dim Cols, Middle As String Cols = "Первая Вторая Третья" Middle = Cols.SubString(6, 6) 'Middle = "Вторая" |
| Зашифровать текст | Используйте оператор Xor и определяемый пользователем код шифрования. Например, этот блок кода использует Xor и код пользователя для шифрования текста из текстового поля strCode = InputBox("Введите код зашифрования")
Code = CShort(strCode)
charsInFile = txtNote.Text.Length
FileOpen(1, SaveFileDialog1.FileName, _
OpenMode.Output)
For i = 0 To charsInFile - 1
letter = txtNote.Text.Substring(i, 1)
Print(1, Asc(letter) Xor Code)
Next
FileClose(1)
|
| Расшифровать текст | Запросите у пользователя код, который он выбрал для шифрования текста и используйте Xor для расшифровки этого текста. Например, блок кода использует Xor и код пользователя для обращения шифрования, созданного в предыдущем примере: strCode = InputBox("Введите код расшифрования")
Code = CShort(strCode)
FileOpen(1, OpenFileDialog1.FileName, _
OpenMode.Input)
Do Until EOF(1)
Input(1, Number)
ch = Chr(Number Xor Code)
Decrypt = Decrypt ch
Loop
txtNote.Text = Decrypt
|
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.