Visual Basic .NET на уроках информатики

Исследование текстовых файлов и обработка строк

Разбить на страницы
Показывать лекцию целиком

В этой лекции вы узнаете, как:

  • отображать содержимое текстового файла с помощью объекта текстового поля;
  • сохранять заметки в текстовом файле;
  • использовать методики обработки строк для сортировки и шифрования текстовых файлов.
  • Управление электронными документами во многих сферах деятельности является очень важной задачей, и Microsoft Visual Basic .NET предоставляет различные механизмы для работы с различными типами документов и обработки их содержимого. Наиболее общим типом документов является текстовый файл, который состоит из неотформатированных слов и параграфов, букв, цифр и специальных символов различного назначения. В этой лекции вы узнаете, как работать с информацией, хранящейся в вашей системе в текстовых файлах. Вы узнаете, как открывать текстовый файл и отображать его содержимое с помощью объекта текстового поля и как создавать на диске новый текстовый файл. Вы также узнаете об управлении строками в вашей программе, и будете использовать методы, принадлежащие классу String из .NET Framework, чтобы объединять, шифровать и отображать слова, строки и целые текстовые файлы.

    Что нового в Visual Basic .NET?

  • В Visual Basic 6 вы открывали и обрабатывали текстовые файлы с помощью ключевых слов Open, Line Input #, Print #, EOF и Close. В Visual Basic .NET имеется новый набор функций, которые выполняют операции с текстовыми файлами. Эти функции предоставляются объектом FileSystem из пространства имен Microsoft.VisualBasic, и включают FileOpen, LineInput, PrintLine и FileClose.
  • В дополнение к только что приведенным встроенным в Visual Basic .NET функциям, для открытия и обработки файлов, просмотра дисков и папок, копирования и удаления файлов, обработки текстовых потоков и выполнения других задач по обработке файлов вы можете использовать объекты из пространства имен System.IO. Объекты в пространстве имен System.IO не заменяют приведенных ранее встроенных функций Visual Basic .NET, а дополняют их.
  • В терминах обработки строк некоторые старые текстовые функции Visual Basic были дополнены новыми методами класса String из .NET Framework. Например, новый метод SubString предоставляет функциональность, аналогичную функции Mid из Visual Basic, а метод ToUpper аналогичен функции UCase из Visual Basic. Для обработки текстов вы можете использовать любой из этих методов, но рекомендуется использовать более новые.
  • Отображение текстовых файлов с помощью объекта текстового поля

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

    Функция Описание
    FileOpen Открывает текстовый файл для ввода или вывода
    LineInput Читает строку ввода из текстового файла
    EOF Проверяет на достижение конца текстового файла
    FileClose Закрывает текстовый файл

    Открытие текстового файла для ввода

    Текстовый файл состоит из одной или более строк цифр, слов или символов. Текстовые файлы отличаются от файлов документов, которые содержат форматирующие коды, и от исполняемых файлов, которые содержат инструкции для операционной системы. Обычные текстовые файлы в вашей системе будут определяться проводником Microsoft Windows как "Text Documents" (Текстовые документы) или иметь расширение .txt, .ini, .log или .inf. Так как текстовые файлы содержат только обычные распознаваемые символы, вы можете легко отобразить их с помощью объектов текстового поля.

    Можно разрешить пользователю выбирать, какой текстовый файл в программе следует открыть. Это делается с помощью элемента управления OpenFileDialog, который спросит у пользователя путь к файлу. Элемент управления OpenFileDialog содержит свойство Filter, которое управляет тем, какой тип файлов в нем отображается, метод ShowDialog, который отображает диалоговое окно Open (Открыть), и свойство FileName, которое возвращает путь, указанный пользователем. Элемент управления OpenFileDialog не открывает файл, он просто предоставляет путь к нему.

    Функция FileOpen

    Получив от пользователя путь, вы открываете в вашей программе файл с помощью функции FileOpen. Сокращенный синтаксис функции FileOpen имеет вид

    FileOpen(номер_файла, путь, режим)

    Полный список аргументов вы можете найти в справочной системе Visual Basic. Вот наиболее важные:

  • номер_файла - это целое от 1 до 255.
  • путь - это корректный путь, по которому можно найти файл.
  • режим - это ключевое слово, указывающее на то, как файл будет использоваться. (В этой лекции вы будете использовать режимы OpenMode.Input и OpenMode.Output.)
  • Номер файла будет ассоциирован с файлом при его открытии. Затем вы будете использовать это число в вашем коде всегда, когда нужно будет сослаться на этот открытый файл. Кроме этой ассоциации есть еще один момент, касающийся этих чисел - Visual Basic использует их для отслеживания различных открываемых в вашей программе файлов.

    Обычная функция FileOpen с использованием объекта OpenFileDialog выглядит так:

    FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)

    Здесь свойство OpenFileDialog1.FileName представляет путь, OpenMode.Input - это режим, а 1 - это номер файла.

    Совет. Текстовые файлы, которые могут быть открыты с помощью этой записи, называются последовательными файлами, так как вы должны работать с их содержимым последовательно. В противоположность им в базе данных вы можете получить доступ к информации в любом порядке. (За дополнительной информацией о базах данных обратитесь к лекции. 19.)

    В следующем упражнении демонстрируется, как использовать для открытия текстового файла элемент управления OpenFileDialog и функцию FileOpen, а также функции LineInput и EOF для отображения содержимого текстового файла в текстовом поле и функцию FileClose для закрытия файла.

    Совет. За дополнительной информацией об использовании элементов управления с закладки Windows Forms окна области элементов для создания стандартных диалоговых окон обратитесь к лекции 4.

    Запуск программы Text Browser

  • Запустите Microsoft Visual Studio и откройте проект Text Browser, находящийся в папке c:\vbnet03sbs\Гл.12\text browser. Этот проект откроется в среде разработки.
  • Если форма проекта не отображается, отобразите ее сейчас. Появится форма Просмотр текста, показанная ниже.

    Эта форма содержит большое текстовое поле, которое имеет полосы прокрутки. Она также содержит главное меню (с командами Открыть, Закрыть и Выход ), диалог открытия файла и метку, которая выдает инструкции к действию. Я также создал установки свойств, показанные в следующей таблице. (Обратите особое внимание на установки текстового поля.)

    Объект Свойство Установка
    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 "Просмотр текста"
  • Щелкните на кнопке Start (Начать) стандартной панели инструментов. Программа Text Browser запустится.
  • В меню Файл программы Text Browser щелкните на команде Открыть. Появится диалоговое окно Открыть.
  • Откройте папку c:\vbnet03sbs\Гл.12\text browser. Содержимое папки Text Browser показано здесь.

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

  • Чтобы просмотреть весь документ, используйте полосы прокрутки.
  • Закончив, щелкните на команде Закрыть из меню Файл, чтобы закрыть этот файл, а затем щелкните на команде Выход для выхода из программы. Программа закроется, и вернется среда разработки.
  • Теперь посмотрите на две важных процедуры событий этой программы.

    Изучение кода программы Text Browser

  • В меню Файл программы Text Browser сделайте двойной щелчок мышью на команде Открыть. В Редакторе кода появится процедура события 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, отключает команду Закрыть и включает команду Открыть.

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

    Использование класса StreamReader для открытия текстовых файлов

    В дополнение к командам 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, для сохранения в нем данных - функцию PrintLine, а для закрытия файла - функцию FileClose. Вы можете использовать этот инструмент дома или на работе для создания заметок, а затем привязки их к текущей дате.

    Запуск программы Quick Note

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл).
  • Откройте проект Quick Note, расположенный в папке c:\vbnet03sbs\ Гл.12\quick note. Этот проект откроется в среде разработки.
  • Если форма проекта не отображается, отобразите ее сейчас. Появится форма Заметки, как показано на следующей иллюстрации. Она выглядит аналогично форме Просмотр текста. Однако я заменил в ней элемент управления OpenFileDialog на элемент управления SaveFileDialog. Меню Файл также содержит различные дополнительные команды, включая Сохранить как, Добавить дату и Выход.

    Я установил следующие свойства этого проекта:

    Объект Свойство Установка
    txtNote Multiline True
    Name txtNote
    ScrollBars Both
    Text пустой (empty)
    lblNote Text "Введите заметку, а затем сохраните ее на диск"
    Form1 Text Заметки
  • Щелкните на кнопке Start (Начать) панели инструментов.
  • Введите в текстовое поле следующий или ваш собственный текст:

    Принцип социальной мобильности

    Это возможность перехода из одной общественной группы в другую, из одного класса в другой. Например:

  • Образование даёт возможность человеку развивать себя, получать большие знания, следовательно есть возможность перехода в другой социальный слой.
  • Деньги дают возможность поменять своё социальное положение и влиться в группу богатых людей.
  • Через службу в армии можно перейти в слой военных.
  • Религия и церковь дают человеку возможность уйти из гражданского общества и перейти в сословие духовенства.
  • Когда вы это сделаете, ваш экран должен выглядеть примерно так.

    Совет. Чтобы вставить в текстовое поле текст из буфера обмена Windows, нажмите (Ctrl)+(V) или (Shift)+(Ins). Чтобы скопировать текст из текстового поля в буфер обмена Windows, выделите текст, а затем нажмите на (Ctrl)+(C).

    Теперь попробуйте использовать команды из меню Файл.

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

    Команда Добавить дату предоставляет удобный способ включить в файл текущую дату. Это полезно, если вы создаете дневник или журнал.

  • В меню Файл щелкните на команде Сохранить как.
  • В диалоговом окне Сохранить как откройте папку c:\vbnet03sbs\Гл.12\ quick note, если она еще не открыта. Затем введите в текстовое поле Имя файла имя SocialMob.txt и щелкните на Сохранить. Текст вашего документа сохранится в новом файле с именем SocialMob.txt.
  • В меню Файл щелкните на команде Выход. Программа остановится, и вернется среда разработки.
  • Теперь посмотрите на процедуры событий этой программы.

    Изучение кода программы Quick Note

  • В меню Файл программы 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, а затем закрывает этот текстовый файл. Обратите особое внимание на оператор

    PrintLine(1, txtNote.Text)	'копируем текст на диск

    который присваивает все содержимое текстового поля открытому файлу. PrintLine аналогична старым операторам 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 сможет при сортировке сравнить один символ с другим, он должен преобразовать каждый из символов в число с помощью таблицы перевода, которая называется таблицей символов ASCII Character Set. ASCII - это сокращение от American Standard Code for Information Interchange (Американский стандартный код для обмена информацией). Большинство основных символов, которые вы можете отобразить на вашем компьютере, имеют различные коды ASCII. Эти коды включают базовый набор символов "пишущей машинки" (коды с 32 до 127) и специальные "управляющие" символы, такие, как табуляция, перевод строки и возврат каретки (коды с 0 до 31). Например, буква "a" (латинская) в нижнем регистре соответствует ASCII-коду 97, а буква "A" (тоже латинская) в верхнем регистре соответствует ASCII-коду 65. Поэтому Visual Basic при сортировке или выполнении других сравнений рассматривает эти два символа как различные.

    В 1980-е годы IBM расширила ASCII кодами 128-255, которые содержали символы национальных языков, греческие символы, символы псевдографики и некоторые другие. ASCII и эти дополнительные символы обычно называются расширенной таблицей символов IBM.

    Совет. Таблицу кодов из набора символов ASCII можно найти по строке "ASCII character codes" в справочной системе Visual Basic.

    Набор символов 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

    Чтобы определить 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 обратно в текстовое поле.

    Запуск программы Sort Text

  • Откройте проект Sort Text, расположенный в папке c:\vbnet03sbs\ Гл.12\sort text.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите в текстовое поле следующий или какой-нибудь собственный текст:

    Зебра
    Горилла
    Луна
    Банан
    Яблоко
    Черепаха

    Убедитесь, что после слова Черепаха или вашей собственной последней строки вы ввели (Enter), иначе Visual Basic не сможет корректно рассчитать число строк.

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

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

    Файл abc.txt содержит 24 строки текста. Каждая строка начинается либо с буквы, либо с цифры (1-10).

  • Чтобы отсортировать содержимое файла abc.txt, щелкните в меню Файл на команде Сортировка текста. Программа Sort Text отсортирует файл в алфавитном порядке и отобразит отсортированные строки в текстовом поле, как показано ниже.

  • Прокрутите файл, чтобы увидеть результаты сортировки по алфавиту. Обратите внимание, что хотя алфавитная часть сортировки прошла вполне корректно, сортировка выдала странный результат для одного из числовых значений - строка, которая начинается с 10, появилась в списке второй, а не десятой. Так произошло потому, что Visual Basic считает 1 и 0 в числе 10 как два независимых символа, а не одно число. Так как мы сравниваем ASCII-коды этих строк слева направо, программа производит исключительно алфавитную сортировку. Если вы хотите отсортировать в этой программе числа, вы должны хранить числа в числовых переменных и сравнивать их как числа, а не как строки.
  • Изучение кода программы Sort Text

  • В меню Файл программы 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 и посмотрите на простой алгоритм шифрования в действии.

    Шифрование текста с помощью изменения ASCII-кодов

  • Закройте решение Sort Text и откройте проект Encrypt Text, расположенный в папке c:\vbnet03sbs\Гл.12\encrypt text.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите в текстовое поле какой-нибудь текст.
  • В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем padua.txt. Когда вы сохраняете текстовый файл, программа изменяет ASCII-код и отображает результаты в текстовом поле, показанном ниже.

    Если вы откроете этот файл в Microsoft Word или другом текстовом редакторе, то увидите тот же результат - для защиты от несанкционированного прочтения символы в файле были зашифрованы.

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

    В нижней части окна текстового поля вы можете увидеть один или два дополнительных символа, которые зависят от количества символов возврата каретки и/или перевода строки, которые вы ввели в конце документа.

  • В меню Файл щелкните на команде Выход и завершите программу.
  • Изучение кода программы Encrypt

  • Чтобы посмотреть код программы, выполняющей увиденное вами при работе с программой шифрование, откройте в Редакторе кода процедуру события 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-сдвиг, требуемый для восстановления этих общих символов и запустив преобразование для всего текстового файла, человек, опытный в шифровании, может с легкостью расшифровать содержимое файла. Этот метод шифрования также не защищает от злонамеренного "физического" воздействия на файл - например, его можно просто удалить, если он не защищен в вашей системе, или его можно определенным образом изменить. Но если вы просто хотите быстро скрыть информацию, эта простая схема шифрования - то, что нужно.

    Следующий шаг: использование оператора Xor

    Описанная выше схема шифрования довольно безопасна для текстовых файлов, так как она сдвигает значение 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 в созданной вами утилите создания заметок.

    Шифрование текста с помощью оператора Xor

  • Закройте решение Encrypt Text, а затем откройте проект Xor Encryption, расположенный в папке c:\vbnet03sbs\Гл.12\xor encryption.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите для шифрования текстового файла следующий текст (или ваш собственный):

    Указ Ротара (Ломбардия, Италия, около 643 г.) 296. О краже винограда. Тот, кто возьмет с лозы другого человека более трех гроздей винограда, должен уплатить в качестве компенсации шесть сольдо. Тот, кто возьмет меньше трех, не несет никакого наказания.

  • В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем oldlaws.txt. Программа запросит у вас секретный код шифрования (число), которое будет использоваться для шифрования файла и его последующей расшифровки. (Заметьте - для расшифровки файла необходимо запомнить этот код.)
  • Введите 500 или любой другой числовой код, а затем нажмите на (Enter), как показано ниже.

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

  • Чтобы очистить текст в текстовом поле, щелкните на команде Закрыть в меню Файл программы. Теперь необходимо восстановить зашифрованный файл.
  • В меню Файл щелкните на команде Открыть зашифрованный файл.
  • Откройте папку c:\vbnet03sbs\Гл.12, а затем дважды щелкните мышью на файле oldlaws.txt.
  • Введите в появившемся диалоговом окне кода шифрования число 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 используется для преобразования каждого символа из текстового поля в числовой код, который затем сохраняется на диск. (До сих пор в этой лекции я использовал функцию PrintLine, которая копировала в файл целую строку, но в данном случае более целесообразно копировать по одному числу.)

    Конечный результат этого шифрования получается не текстовым, а числовым - это поставит в тупик даже самого настойчивого шпиона. Например, следующая иллюстрация показывает зашифрованный файл, полученный в результате использования приведенной выше процедуры шифрования, открытый в блокноте 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 ) объединяются со строковой переменной Decrypt, которая хранит весь расшифрованный файл, как показано здесь:

    ch = Chr(Number Xor Code)		'преобразуем с помощью Xor
    Decrypt = Decrypt  ch			'и создаем строку

    Техники шифрования, подобные этой, полезны и могут также использоваться в образовательных целях. Так как шифрование в большой степени основано на обработке строк, это хороший способ попрактиковаться в базовых и очень важных приемах программирования на Visual Basic. Только убедитесь, что вы не потеряете ваш ключ шифрования!

    Краткая справка по лекции 12

    Чтобы Сделайте следующее
    Открыть текстовый файл Используйте функцию 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. Например:

    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 и код пользователя для шифрования текста из текстового поля txtNote и сохраняет его в файле encrypt.txt в виде набора чисел:

    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, чтобы объединять, шифровать и отображать слова, строки и целые текстовые файлы.

    Что нового в Visual Basic .NET?

  • В Visual Basic 6 вы открывали и обрабатывали текстовые файлы с помощью ключевых слов Open, Line Input #, Print #, EOF и Close. В Visual Basic .NET имеется новый набор функций, которые выполняют операции с текстовыми файлами. Эти функции предоставляются объектом FileSystem из пространства имен Microsoft.VisualBasic, и включают FileOpen, LineInput, PrintLine и FileClose.
  • В дополнение к только что приведенным встроенным в Visual Basic .NET функциям, для открытия и обработки файлов, просмотра дисков и папок, копирования и удаления файлов, обработки текстовых потоков и выполнения других задач по обработке файлов вы можете использовать объекты из пространства имен System.IO. Объекты в пространстве имен System.IO не заменяют приведенных ранее встроенных функций Visual Basic .NET, а дополняют их.
  • В терминах обработки строк некоторые старые текстовые функции Visual Basic были дополнены новыми методами класса String из .NET Framework. Например, новый метод SubString предоставляет функциональность, аналогичную функции Mid из Visual Basic, а метод ToUpper аналогичен функции UCase из Visual Basic. Для обработки текстов вы можете использовать любой из этих методов, но рекомендуется использовать более новые.
  • Отображение текстовых файлов с помощью объекта текстового поля

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

    Функция Описание
    FileOpen Открывает текстовый файл для ввода или вывода
    LineInput Читает строку ввода из текстового файла
    EOF Проверяет на достижение конца текстового файла
    FileClose Закрывает текстовый файл

    Открытие текстового файла для ввода

    Текстовый файл состоит из одной или более строк цифр, слов или символов. Текстовые файлы отличаются от файлов документов, которые содержат форматирующие коды, и от исполняемых файлов, которые содержат инструкции для операционной системы. Обычные текстовые файлы в вашей системе будут определяться проводником Microsoft Windows как "Text Documents" (Текстовые документы) или иметь расширение .txt, .ini, .log или .inf. Так как текстовые файлы содержат только обычные распознаваемые символы, вы можете легко отобразить их с помощью объектов текстового поля.

    Можно разрешить пользователю выбирать, какой текстовый файл в программе следует открыть. Это делается с помощью элемента управления OpenFileDialog, который спросит у пользователя путь к файлу. Элемент управления OpenFileDialog содержит свойство Filter, которое управляет тем, какой тип файлов в нем отображается, метод ShowDialog, который отображает диалоговое окно Open (Открыть), и свойство FileName, которое возвращает путь, указанный пользователем. Элемент управления OpenFileDialog не открывает файл, он просто предоставляет путь к нему.

    Функция FileOpen

    Получив от пользователя путь, вы открываете в вашей программе файл с помощью функции FileOpen. Сокращенный синтаксис функции FileOpen имеет вид

    FileOpen(номер_файла, путь, режим)

    Полный список аргументов вы можете найти в справочной системе Visual Basic. Вот наиболее важные:

  • номер_файла - это целое от 1 до 255.
  • путь - это корректный путь, по которому можно найти файл.
  • режим - это ключевое слово, указывающее на то, как файл будет использоваться. (В этой лекции вы будете использовать режимы OpenMode.Input и OpenMode.Output.)
  • Номер файла будет ассоциирован с файлом при его открытии. Затем вы будете использовать это число в вашем коде всегда, когда нужно будет сослаться на этот открытый файл. Кроме этой ассоциации есть еще один момент, касающийся этих чисел - Visual Basic использует их для отслеживания различных открываемых в вашей программе файлов.

    Обычная функция FileOpen с использованием объекта OpenFileDialog выглядит так:

    FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)

    Здесь свойство OpenFileDialog1.FileName представляет путь, OpenMode.Input - это режим, а 1 - это номер файла.

    Совет. Текстовые файлы, которые могут быть открыты с помощью этой записи, называются последовательными файлами, так как вы должны работать с их содержимым последовательно. В противоположность им в базе данных вы можете получить доступ к информации в любом порядке. (За дополнительной информацией о базах данных обратитесь к лекции. 19.)

    В следующем упражнении демонстрируется, как использовать для открытия текстового файла элемент управления OpenFileDialog и функцию FileOpen, а также функции LineInput и EOF для отображения содержимого текстового файла в текстовом поле и функцию FileClose для закрытия файла.

    Совет. За дополнительной информацией об использовании элементов управления с закладки Windows Forms окна области элементов для создания стандартных диалоговых окон обратитесь к лекции 4.

    Запуск программы Text Browser

  • Запустите Microsoft Visual Studio и откройте проект Text Browser, находящийся в папке c:\vbnet03sbs\Гл.12\text browser. Этот проект откроется в среде разработки.
  • Если форма проекта не отображается, отобразите ее сейчас. Появится форма Просмотр текста, показанная ниже.

    Эта форма содержит большое текстовое поле, которое имеет полосы прокрутки. Она также содержит главное меню (с командами Открыть, Закрыть и Выход ), диалог открытия файла и метку, которая выдает инструкции к действию. Я также создал установки свойств, показанные в следующей таблице. (Обратите особое внимание на установки текстового поля.)

    Объект Свойство Установка
    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 "Просмотр текста"
  • Щелкните на кнопке Start (Начать) стандартной панели инструментов. Программа Text Browser запустится.
  • В меню Файл программы Text Browser щелкните на команде Открыть. Появится диалоговое окно Открыть.
  • Откройте папку c:\vbnet03sbs\Гл.12\text browser. Содержимое папки Text Browser показано здесь.

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

  • Чтобы просмотреть весь документ, используйте полосы прокрутки.
  • Закончив, щелкните на команде Закрыть из меню Файл, чтобы закрыть этот файл, а затем щелкните на команде Выход для выхода из программы. Программа закроется, и вернется среда разработки.
  • Теперь посмотрите на две важных процедуры событий этой программы.

    Изучение кода программы Text Browser

  • В меню Файл программы Text Browser сделайте двойной щелчок мышью на команде Открыть. В Редакторе кода появится процедура события 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, отключает команду Закрыть и включает команду Открыть.

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

    Использование класса StreamReader для открытия текстовых файлов

    В дополнение к командам 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, для сохранения в нем данных - функцию PrintLine, а для закрытия файла - функцию FileClose. Вы можете использовать этот инструмент дома или на работе для создания заметок, а затем привязки их к текущей дате.

    Запуск программы Quick Note

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл).
  • Откройте проект Quick Note, расположенный в папке c:\vbnet03sbs\ Гл.12\quick note. Этот проект откроется в среде разработки.
  • Если форма проекта не отображается, отобразите ее сейчас. Появится форма Заметки, как показано на следующей иллюстрации. Она выглядит аналогично форме Просмотр текста. Однако я заменил в ней элемент управления OpenFileDialog на элемент управления SaveFileDialog. Меню Файл также содержит различные дополнительные команды, включая Сохранить как, Добавить дату и Выход.

    Я установил следующие свойства этого проекта:

    Объект Свойство Установка
    txtNote Multiline True
    Name txtNote
    ScrollBars Both
    Text пустой (empty)
    lblNote Text "Введите заметку, а затем сохраните ее на диск"
    Form1 Text Заметки
  • Щелкните на кнопке Start (Начать) панели инструментов.
  • Введите в текстовое поле следующий или ваш собственный текст:

    Принцип социальной мобильности

    Это возможность перехода из одной общественной группы в другую, из одного класса в другой. Например:

  • Образование даёт возможность человеку развивать себя, получать большие знания, следовательно есть возможность перехода в другой социальный слой.
  • Деньги дают возможность поменять своё социальное положение и влиться в группу богатых людей.
  • Через службу в армии можно перейти в слой военных.
  • Религия и церковь дают человеку возможность уйти из гражданского общества и перейти в сословие духовенства.
  • Когда вы это сделаете, ваш экран должен выглядеть примерно так.

    Совет. Чтобы вставить в текстовое поле текст из буфера обмена Windows, нажмите (Ctrl)+(V) или (Shift)+(Ins). Чтобы скопировать текст из текстового поля в буфер обмена Windows, выделите текст, а затем нажмите на (Ctrl)+(C).

    Теперь попробуйте использовать команды из меню Файл.

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

    Команда Добавить дату предоставляет удобный способ включить в файл текущую дату. Это полезно, если вы создаете дневник или журнал.

  • В меню Файл щелкните на команде Сохранить как.
  • В диалоговом окне Сохранить как откройте папку c:\vbnet03sbs\Гл.12\ quick note, если она еще не открыта. Затем введите в текстовое поле Имя файла имя SocialMob.txt и щелкните на Сохранить. Текст вашего документа сохранится в новом файле с именем SocialMob.txt.
  • В меню Файл щелкните на команде Выход. Программа остановится, и вернется среда разработки.
  • Теперь посмотрите на процедуры событий этой программы.

    Изучение кода программы Quick Note

  • В меню Файл программы 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, а затем закрывает этот текстовый файл. Обратите особое внимание на оператор

    PrintLine(1, txtNote.Text)	'копируем текст на диск

    который присваивает все содержимое текстового поля открытому файлу. PrintLine аналогична старым операторам 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 сможет при сортировке сравнить один символ с другим, он должен преобразовать каждый из символов в число с помощью таблицы перевода, которая называется таблицей символов ASCII Character Set. ASCII - это сокращение от American Standard Code for Information Interchange (Американский стандартный код для обмена информацией). Большинство основных символов, которые вы можете отобразить на вашем компьютере, имеют различные коды ASCII. Эти коды включают базовый набор символов "пишущей машинки" (коды с 32 до 127) и специальные "управляющие" символы, такие, как табуляция, перевод строки и возврат каретки (коды с 0 до 31). Например, буква "a" (латинская) в нижнем регистре соответствует ASCII-коду 97, а буква "A" (тоже латинская) в верхнем регистре соответствует ASCII-коду 65. Поэтому Visual Basic при сортировке или выполнении других сравнений рассматривает эти два символа как различные.

    В 1980-е годы IBM расширила ASCII кодами 128-255, которые содержали символы национальных языков, греческие символы, символы псевдографики и некоторые другие. ASCII и эти дополнительные символы обычно называются расширенной таблицей символов IBM.

    Совет. Таблицу кодов из набора символов ASCII можно найти по строке "ASCII character codes" в справочной системе Visual Basic.

    Набор символов 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

    Чтобы определить 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 обратно в текстовое поле.

    Запуск программы Sort Text

  • Откройте проект Sort Text, расположенный в папке c:\vbnet03sbs\ Гл.12\sort text.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите в текстовое поле следующий или какой-нибудь собственный текст:

    Зебра
    Горилла
    Луна
    Банан
    Яблоко
    Черепаха

    Убедитесь, что после слова Черепаха или вашей собственной последней строки вы ввели (Enter), иначе Visual Basic не сможет корректно рассчитать число строк.

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

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

    Файл abc.txt содержит 24 строки текста. Каждая строка начинается либо с буквы, либо с цифры (1-10).

  • Чтобы отсортировать содержимое файла abc.txt, щелкните в меню Файл на команде Сортировка текста. Программа Sort Text отсортирует файл в алфавитном порядке и отобразит отсортированные строки в текстовом поле, как показано ниже.

  • Прокрутите файл, чтобы увидеть результаты сортировки по алфавиту. Обратите внимание, что хотя алфавитная часть сортировки прошла вполне корректно, сортировка выдала странный результат для одного из числовых значений - строка, которая начинается с 10, появилась в списке второй, а не десятой. Так произошло потому, что Visual Basic считает 1 и 0 в числе 10 как два независимых символа, а не одно число. Так как мы сравниваем ASCII-коды этих строк слева направо, программа производит исключительно алфавитную сортировку. Если вы хотите отсортировать в этой программе числа, вы должны хранить числа в числовых переменных и сравнивать их как числа, а не как строки.
  • Изучение кода программы Sort Text

  • В меню Файл программы 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 и посмотрите на простой алгоритм шифрования в действии.

    Шифрование текста с помощью изменения ASCII-кодов

  • Закройте решение Sort Text и откройте проект Encrypt Text, расположенный в папке c:\vbnet03sbs\Гл.12\encrypt text.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите в текстовое поле какой-нибудь текст.
  • В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем padua.txt. Когда вы сохраняете текстовый файл, программа изменяет ASCII-код и отображает результаты в текстовом поле, показанном ниже.

    Если вы откроете этот файл в Microsoft Word или другом текстовом редакторе, то увидите тот же результат - для защиты от несанкционированного прочтения символы в файле были зашифрованы.

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

    В нижней части окна текстового поля вы можете увидеть один или два дополнительных символа, которые зависят от количества символов возврата каретки и/или перевода строки, которые вы ввели в конце документа.

  • В меню Файл щелкните на команде Выход и завершите программу.
  • Изучение кода программы Encrypt

  • Чтобы посмотреть код программы, выполняющей увиденное вами при работе с программой шифрование, откройте в Редакторе кода процедуру события 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-сдвиг, требуемый для восстановления этих общих символов и запустив преобразование для всего текстового файла, человек, опытный в шифровании, может с легкостью расшифровать содержимое файла. Этот метод шифрования также не защищает от злонамеренного "физического" воздействия на файл - например, его можно просто удалить, если он не защищен в вашей системе, или его можно определенным образом изменить. Но если вы просто хотите быстро скрыть информацию, эта простая схема шифрования - то, что нужно.

    Следующий шаг: использование оператора Xor

    Описанная выше схема шифрования довольно безопасна для текстовых файлов, так как она сдвигает значение 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 в созданной вами утилите создания заметок.

    Шифрование текста с помощью оператора Xor

  • Закройте решение Encrypt Text, а затем откройте проект Xor Encryption, расположенный в папке c:\vbnet03sbs\Гл.12\xor encryption.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать).
  • Введите для шифрования текстового файла следующий текст (или ваш собственный):

    Указ Ротара (Ломбардия, Италия, около 643 г.) 296. О краже винограда. Тот, кто возьмет с лозы другого человека более трех гроздей винограда, должен уплатить в качестве компенсации шесть сольдо. Тот, кто возьмет меньше трех, не несет никакого наказания.

  • В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем oldlaws.txt. Программа запросит у вас секретный код шифрования (число), которое будет использоваться для шифрования файла и его последующей расшифровки. (Заметьте - для расшифровки файла необходимо запомнить этот код.)
  • Введите 500 или любой другой числовой код, а затем нажмите на (Enter), как показано ниже.

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

  • Чтобы очистить текст в текстовом поле, щелкните на команде Закрыть в меню Файл программы. Теперь необходимо восстановить зашифрованный файл.
  • В меню Файл щелкните на команде Открыть зашифрованный файл.
  • Откройте папку c:\vbnet03sbs\Гл.12, а затем дважды щелкните мышью на файле oldlaws.txt.
  • Введите в появившемся диалоговом окне кода шифрования число 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 используется для преобразования каждого символа из текстового поля в числовой код, который затем сохраняется на диск. (До сих пор в этой лекции я использовал функцию PrintLine, которая копировала в файл целую строку, но в данном случае более целесообразно копировать по одному числу.)

    Конечный результат этого шифрования получается не текстовым, а числовым - это поставит в тупик даже самого настойчивого шпиона. Например, следующая иллюстрация показывает зашифрованный файл, полученный в результате использования приведенной выше процедуры шифрования, открытый в блокноте 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 ) объединяются со строковой переменной Decrypt, которая хранит весь расшифрованный файл, как показано здесь:

    ch = Chr(Number Xor Code)		'преобразуем с помощью Xor
    Decrypt = Decrypt  ch			'и создаем строку

    Техники шифрования, подобные этой, полезны и могут также использоваться в образовательных целях. Так как шифрование в большой степени основано на обработке строк, это хороший способ попрактиковаться в базовых и очень важных приемах программирования на Visual Basic. Только убедитесь, что вы не потеряете ваш ключ шифрования!

    Краткая справка по лекции 12

    Чтобы Сделайте следующее
    Открыть текстовый файл Используйте функцию 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. Например:

    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 и код пользователя для шифрования текста из текстового поля txtNote и сохраняет его в файле encrypt.txt в виде набора чисел:

    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
    Вернуться к учебному плану