Раз-04-Инф-210700 / УчеП-Раз-4-Инф-270100 / Тема-04-10
.pdfТема 4.10. Текстовые файлы
Перейти кТеме 4.9 Теме 4.11 Огл. 4.10.1. Основные понятия
4.10.2. Средства VВ для доступа к текстовым файлам
4.10.3. Использование классов StreamReader , StreamWriter и объекта
My.Computer.FileSystem для работы с текстовыми файлами 4.10.4. Печать текстовых файлов 4.10.5. Задачи для самостоятельного решения по теме «Текстовые файлы»
4.10.6. Тестовые задания по теме «Текстовые файлы»
4.10.1. Основные понятия
Текстовые данные в приложениях VB можно не только вводить с клавиатуры и отображать на экране, но и читать из файла, где они хранятся, и записывать в файл.
Файл – это поименованная совокупность любых данных, размещенная на внешнем запоминающем устройстве, хранимая, пересылаемая и обрабатываемая как единое целое. Файл может содержать программу, числовые данные, текст, закодированное изображение и пр. Физически файлы реализуются как участки памяти на внешних носителях, например, на магнитных дисках или CD-ROM. Обслуживает файлы специальный модуль операционной системы, называемый драйвером файловой системы. Каждый файл должен иметь имя, зарегистрированное в каталоге.
Каталог (директория или папка) –это оглавление файлов. Содержимое каталога можно просматривать, переименовывать зарегистрированные в нем файлы, переносить их содержимое на новое место и удалять. Каталог, как и файл, имеет собственное имя и хранится в другом каталоге наряду с обычными файлами: так образуются иерархические файловые структуры.
Драйвер файловой системы – это программа операционной системы, которая обеспечивает доступ к информации, записанной на магнитный носитель, по имени файла и распределяет пространство на магнитном носителе между файлами. Для выполнения этих функций драйвер файловой системы хранит не только информацию пользователя, но и свою собственную служебную информацию. В служебных областях носителя хранится список всех файлов и каталогов, а также различные дополнительные справочные таблицы, служащие для повышения скорости работы драйвера файловой системы.
К файловой системе имеет доступ и любая прикладная программа, для этого во всех языках программирования, в том числе и в VB, имеются специальные средства в виде функций и целых классов для работы с файлами.
По способу доступа к данным различают файлы последовательного доступа, произвольного доступа и двоичные. В файлах первого вида доступ к информации осуществляется последовательно от начала до конца файла, в файлах произвольного доступа– либо последовательно, либо в произвольном порядке, а в двоичных файлах – побайтно.
Текстовые файлы являются последовательными файлами, состоящими из записей переменной длины, расположенными на внешнем носителе. Они называются файлами с последовательным доступом потому, что могут читаться только с самого начала по порядку. Запись нельзя прочитать из середины файла. Каждая запись является строкой текста, которая заканчивается специальными символами-разделителями (vbCrLf или vbNewLine).
Текстовый файл состоит из одной или более строк, слов или символов. Он отличается от |
|
Тема 4.10.Текстовыефайлы |
Страница 254 |
файлов документов и веб-страниц, которые содержат форматирующие коды, и от исполняемых файлов, которые содержат инструкции для операционной системы. Обычные текстовые файлы определены в MSWindows как TextDocuments (Текстовые документы) и имеют расширение *.txt. Так как текстовые файлы содержат только обычные распознаваемые символы, их можно легко отобразить на экране с помощьюстандартных средств VB, например, с помощью объектов текстового поля.
Работа с любым файлом, в том числе с текстовыми файлами, состоит из трех этапов:
•открытие файлов;
•чтение или запись информации из файла или в файл;
•закрытие файла.
Для загрузки в текстовое поле или строку содержимого текстового файла, а также для записи строковых данных в файл можно использовать как функции VB, так и методы классов
.NET Framework.
В VB можно использовать три способа доступа к текстовым файлам:
1.С использованием дескрипторов (дескрипторный доступ), т.е. процедур и функций VB с указанием номера файла. Эти процедуры и функции являются методами класса FileSystem библиотеки Microsoft.VisualBasic.
2.С использованием методов библиотеки классов System.IO(потоковый доступ).
3.С использованием объекта My.Computer.System.
4.10.2. Средства VB для доступа к текстовым файлам
Рассмотрим дескрипторный способ доступа к текстовым файлам, который использует функции VB, представленные в таб. 4.10.2-1.
|
Таблица 4.10.2-1 |
Функция |
Описание |
FileOpen( ) |
Открывает текстовый файл для ввода или вывода |
LineInput( ) |
Читает строку из текстового файла |
PrintLine( ) |
Записывает строку в текстовый файл |
EOF( ) |
Проверяет достижение конца текстового файла |
FileClose( ) |
Закрывает текстовый файл |
|
|
Для указания путей к файлам можно использовать элемент управления OpenFileDialog, позволяющий запрашивать у пользователя путь к файлу и выбирать тот текстовый файл в программе, который следует открыть. Этот элемент управления имеет множество свойств, в том числе свойство Filter, которое управляет тем, какой тип файлов в нем отображается, и свойство FileName, которое возвращает путь к файлу, указанный
пользователем, а также метод ShowDialog( ), который отображает диалоговое окно MSWindowsOpen. Подробное описание элементов управления для работы с файлами можно найти в [2-4].
Итак, файл может быть открыт с помощью функции FileOpen( ), простейший синтаксис которой имеетследующий вид:
FileOpen (НомерФайла, ПутьФайл, Мода),
где: НомерФайла – это целое число от 1 до 255(дескриптор), которое приписывается файлу при открытии, а затем это число используется, когда требуется сослаться на этот открытый файл;
ПутьФайл – это корректный путь в файловой системе MSWindows;
Мода – это ключевое слово, указывающее на то, как файл будет использоваться OpenMode.Input (для чтения из файла) и OpenMode.Output (для записи в файл).
Тема 4.10.Текстовыефайлы
Создание новых файлов на диске и сохранение в них данных используется, когда требуется создать собственные отчеты, сохранить важные вычисления или значения, или создать специализированный текстовый процессор или текстовый редактор. Вот перечень действий, которые требуется выполнить для этого в программах:
1.Получить ввод от пользователя, выполнить математические вычисления или сделать и то, и другое.
2.Присвоить результаты обработки одной или нескольким переменным. Например, можно присвоить содержимое текстового поля строковой переменной.
3.Получить путь к файлу с помощью TextBox или запросить у пользователя путь с помощью элемента управления SaveFileDialog. Для отображения этого диалогового окна используется метод ShowDialog( ).
4.Открыть файл для записи,в соответствии с полученным путем с помощью функции
FileOpen( ).
5.Использовать функцию PrintLine( ) для сохранения одного или нескольких значений в открытом файле
6.Закрыть файл с помощью функции FileClose( )по окончании записи.
Рассмотрим пример, как использовать функцию FileOpen( )для открытия текстового файла. Также этотпример демонстрирует, как использовать функции LineInput( ),
PrintLine( )и EOF( )для работы с файлом, а для закрытия файла – функцию
FileClose().
Пример 4.10.2-1. Создать проект, который будет отображать содержимое файла на форме с помощью текстового поля с использованием функции LineInput( ), а после редактирования текстового поля будет записывать строку в текстовый файл.
1. Создать форму проекта Проект-4-10-2-1, которая показана на рис. 4.10.2-1.
Рис. 4.10.2-1
Свойства объектов формы сведены в табл. 4.10.2-2.
|
|
|
|
Таблица 4.10.2-2 |
|
Объект |
Свойство |
|
Значение |
|
TextBox1 |
Enabled |
False |
|
|
|
|
|
|
|
|
Multiline |
True |
|
|
|
Name |
TextBox1 |
|
|
|
ScrollBars |
Vertical |
|
|
TextBox2 |
Name |
TextBox2 |
|
Тема 4.10.Текстовыефайлы |
|
Страница 256 |
|
Multiline |
|
True |
Label1 |
Text |
|
" Путь файла " |
|
Name |
|
Label1 |
Button1 |
Name |
|
Button1 |
Text |
|
"Загрузить содержимое файла" |
|
|
|
||
Button2 |
Name |
|
Button2 |
Text |
|
"Записать содержимое в файл" |
|
|
|
||
Button3 |
Name |
|
Button3 |
Text |
|
"Конец" |
|
|
|
||
Form1 |
Text |
|
"Пример 4.10.2-1. Чтение и запись в текстовый файл" |
2. Написать программный код, который представлен на рис. 4.10.2-2.
|
Public Class Form1 |
|
|
|
'Процедура открытия файла для вывода и |
|
|
|
'записи содержимого текстового поля в открытый файл |
|
|
|
Sub SaveFile(ByVal FileName As String, ByVal T As TextBox) |
|
|
|
If FileName <> "" Then |
|
|
|
FileOpen(1, FileName, OpenMode.Output) |
|
|
|
PrintLine(1, T.Text) |
|
|
|
FileClose(1) |
|
|
|
End If |
|
|
|
End Sub |
|
|
|
'Отображение содержимого файла в текстовом поле |
|
|
|
Sub OpenFile(ByVal FileName As String, ByVal T As TextBox) |
|
|
|
Dim AllText As String = "" |
|
|
|
Dim LineOfText As String = "" |
|
|
|
Try 'Открытие файла и перехват всех ошибок |
|
|
|
FileOpen(1, FileName, OpenMode.Input) |
|
|
|
Do Until EOF(1) |
'Чтение строки из файла, до тех пор пока не |
|
|
LineOfText = LineInput(1)' будет достигнут конец файла |
|
|
|
'Добавление строки в переменную ALLText |
|
|
|
AllText = AllText & LineOfText & vbCrLf |
|
|
|
Loop |
|
|
|
T.Text = AllText'Отображение содержимого файла в текст. поле |
|
|
|
T.Enabled = True'Включение текстового курсора |
|
|
|
Catch ex As Exception |
|
|
|
MsgBox("Ошибкаоткрытияфайла.") |
|
|
|
Finally |
'Закрытие файла |
|
|
FileClose(1) |
|
|
|
End Try |
|
|
|
End Sub |
|
|
|
'Функция ввода пути к файлу из TextBox |
|
|
|
Function vvod(ByVal T As TextBox) As String |
|
|
|
Return T.Text |
|
|
|
End Function |
|
|
|
Private Sub Button3_Click(ByVal sender As System.Object, _ |
|
|
|
ByVal e As System.EventArgs) Handles Button3.Click |
|
|
|
End |
|
|
|
End Sub |
|
|
|
Private Sub Button1_Click(ByVal sender As System.Object, _ |
|
|
|
ByVal e As System.EventArgs) Handles Button1.Click |
|
|
|
Dim FileName As String |
|
|
|
FileName = vvod(TextBox2) |
|
|
|
OpenFile(FileName, TextBox1) |
|
|
|
End Sub |
|
|
Тема 4.10.Текстовыефайлы |
Страница 257 |
|
Private Sub Button2_Click_1(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim FileName As String
FileName = vvod(TextBox2)
SaveFile(FileName, TextBox1)
End Sub
End Class
Рис. 4.10.2-2
Процедура OpenFile( )выполняет следующие действия:
•объявляет переменные;
•с помощью блока кода Try...Catch…End Try перехватывает ошибки;
•с помощью функции FileOpen( )открывает указанный файл для ввода (чтение из файла);
•использует функцию Linelnput( )для построчного копирования файла в строку с именем AllText;
•копирует строки до тех пор, пока не будет достигнут конец файла– EOF( ), или до тех пор, пока в строке не останется больше места (строка AllText имеет место для очень большого файла, но если в процессе копирования произойдет ошибка, блок Catch выведет сообщение об этой ошибке);
•отображает строку AllText в текстовом поле и включает полосы прокрутки и текстовый курсор;
•закрывает файл с помощью функции FileClose( ).
Процедура SaveFile( )выполняет следующие действия:
•проверяет правильность пути к файлу;
•с помощью функции FileOpen( )открывает указанный файл для вывода (записи в файл);
•использует функцию PrintLine( )для записи содержимого текстового поля в файл;
•закрывает файл с помощью функции FileClose( ).
3.Запустить проект Проект-4.10.2-1.
4.Ввести в текстовое поле TextBox2 путь к файлу.
5.Щелкнуть мышью на кнопке Загрузить содержимое файла.
Втекстовом поле TextBox1 появится содержимое текстового файла Тесты.txt
(рис. 4.10.2-3).
Тема 4.10.Текстовыефайлы |
Страница 258 |
Рис. 4.10.2-3
6.Закончив просмотр и отредактировав содержимое текстового поля объекта TextBox1,
необходимо щелкнуть на кнопке Записать содержимое строки в файл.
7.Процесс загрузки содержимого текстового файла, его редактирования и записи содержимого текстового поля в файл можно повторить несколько раз.
8.Для окончания работы программы необходимо щелкнуть на кнопке Конец.
Рассмотрим подробнее средства VB для обработки ошибок времени выполнения.
Ошибки времени выполнения (также называемые исключениями) возникают при нормальных условиях работы - например, из-за отсутствия диска в дисководе или неправильного заданного пути при открытии файла. Блоки кода, обрабатывающие такие ошибки, называются структурными обработчиками ошибок (или структурными обработчиками исключений). Их можно использовать для распознавания ошибок времени исполнения при их возникновении в программе и настройки программы так, что она снова сможет получить управление и продолжить работу. Для этого в VB имеется блок Try…Catch…End Try – синтаксическая конструкция для обработки ошибок.
Ошибка времени исполнения возникает тогда, когда VB пытается выполнить оператор, который по какой-то причине не может быть выполнен в том виде, в котором он написан. Это не значит, что VB не достаточно «умен», чтобы справиться с проблемой; это значит, что компилятору VB не сказали, что делать, если что-то пойдет не так.
Можно написать специальные процедуры VB, называемые структурными обработчиками ошибок, которые будут реагировать на ошибки времени исполнения. Обработчик ошибок отслеживает ошибку времени исполнения и говорит программе, как продолжать работу при возникновении этой ошибки. Обработчики ошибок помещаются в процедуры событий, там, где существует возможность возникновения проблемы, или в общие функции или подпрограммы, специально предназначенные для обработки ошибок. Как предполагает их название, обработчики ошибок обрабатывают ошибку с помощью оператора Try…Catch…End Try и специального объекта отслеживания ошибок – экземпляра класса Exception. Например, если ошибка времени исполнения произошла при загрузке файла с диска, обработчик ошибок может отобразить собственное сообщение об ошибке, которое укажет на проблему.
Оператор Try необходимо поместить в процедуру события непосредственно перед оператором, в котором может произойти непредвиденная ситуация, а блок Catch следует
непосредственно за ним и содержит операторы, которые необходимо |
выполнить, если |
Тема 4.10.Текстовыефайлы |
Страница 259 |
произойдет ошибка времени исполнения. Также можно использовать некоторые дополнительные операторы, такие, как Finally, а также вложенные блоки кода Try…Catch…End Try. Базовый синтаксис обработчика исключений Try…Catch…End Try может иметь следующий формат:
Try
Операторы, которые могут вызвать ошибку времени исполнения
Catch
Операторы, которые выполняются, если ошибка времени исполнения происходит
Finally
Дополнительные операторы, выполняемые независимо от возникновения ошибки
End Try
где Try, Catch и End Try - это обязательные ключевые слова, а Finally и операторы, которые стоят за ним, необязательны.
В примере 4.10.2-1 продемонстрирована обычная ситуация возникновения ошибки времени выполнения, связанная с открытием файла.
Пример 4.10.2-2. Создать проект сортировки строк текста, который загружается из текстового файла и после сортировки сохраняется в этом же файле.
1. Форма проекта Пример 4.10.2-2 показана на рис. 4.10.2-4
Рис. 4.10.2-4
2. Программный код проекта показан на рис. 4.10.2-5. Он содержит процедуры
OpenFile( ), SaveFile( ), vvod( ) и использует метод Sort( ) класса Array для сортировки массива строк. Для преобразования загруженной строки в массив строк используется функция Split( ), а в качестве разделителей – коды возврата каретки и перевода строки (vbCrLf). Обратное преобразование массива в строку производится с помощью функции Join( ).
Public Class Form1
Function vvod(ByVal T As TextBox) As String Return T.Text
End Function
Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click
Тема 4.10.Текстовыефайлы |
Страница 260 |
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click
Dim Str1, Str2 As String
Str1 = vvod(TextBox2)
Dim Mas() As String = Split(Str1, vbCrLf)
Array.Sort(Mas) : Str2 = Join(Mas)
TextBox2.Text = Str1 & vbCrLf & vbCrLf & Str2
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click
Dim FileName As String
FileName = vvod(TextBox1) : OpenFile(FileName, TextBox2)
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click
Dim FileName As String
FileName = vvod(TextBox1)
SaveFile(FileName, TextBox2)
End Sub
Sub OpenFile(ByVal FileName As String, ByVal T As TextBox)
Dim AllText As String = "", LineOfText As String = ""
Try FileOpen(1, FileName, OpenMode.Input)
Do Until EOF(1) 'чтение строки из файла
LineOfText = LineInput(1)
LoopAllText = AllText & LineOfText & vbCrLf
T.Text = AllText : T.Enabled = True
Catch
Finally MsgBox("Ошибка при открытии файла. ")
End Try FileClose(1) 'закрытие файла
End Sub
Sub SaveFile(ByVal FileName As String, ByVal T As TextBox)
If FileName <>""Then
FileOpen(1, FileName, OpenMode.Output)
'Запись содержимого текстового поля в файл
PrintLine(1, T.Text) : FileClose(1)
End If
End Sub
End Class
Рис. 4.10.2-5
Тема 4.10.Текстовыефайлы |
Страница 261 |
Результат работы программы показан на рис. 4.10.2-6.
Рис. 4.10.2-6
4.10.3. Использование классов StreamReader, StreamWriter
и объекта My.Computer.FileSystem для работы с текстовыми файлами
Ранее был рассмотрен доступ к файлам с помощью дескрипторов (номеров), который является средством VB. В данной версии VS предпочтительным и более эффективным является потоковый доступ к файлам, который является средством .NET Framework и определен в пространстве имен (библиотеке классов)System.IO.
Поток (Stream) в VS – это абстрактный тип Stream, который представляет последовательность байтов (символов), передаваемых в среду или из среды для хранения информации. Потоки позволяют считывать и записывать данные на запоминающее устройство, которое в нашем случае соответствует файлу. Поэтому над потоками в основном выполняются
операции чтения (Read),записи (Write)и поиска (Seek), которые реализованы в классе
System.IO.Stream. Причем большинство потоковых объектов выполняют буферизацию данных, которая позволяет значительно повысить эффективность операций ввода/вывода. Например, данные потока не записываются сразу на диск, когда производится запись в файл, а помещаются в буфер и затем сбрасываются на диск, когда поток закрывается.
Таким образом, потоки класса System.IO.Stream осуществляют управление файлами на уровне отдельных байтов. Чтобы сделать операции чтения и записи более эффективными и удобными, в пространстве имен System.IO имеются средства для открытия и отображения текстовых файлов. Так, например, имеются классы StreamReader и StreamWriter, а также
объект My.Computer.FileSystem.
Чтобы использовать классы StreamReader и StreamWriter, в начале программного кода следует добавить оператор доступа к этим классам: Imports System.IO.
Класс StreamReader |
из библиотеки .NET Framework позволяет открывать в |
|
программе и отображать на экране текстовые файлы. На рис. 4.10.3-1 |
и рис. 4.10.3-2 |
|
представлены процедуры |
чтения содержимого всего текстового файла |
целиком в одну |
строку и построчного чтения данных из текстового файла. Обе эти процедуры имеют
входной |
параметр filename (имя файла) и выходной параметр p (строка, |
содержащая |
значения, |
прочитанные из файла). |
|
Тема 4.10.Текстовыефайлы |
Страница 262 |
'Процедура чтения из текстового файла
Sub readfile1(ByVal filename As String, ByRef p As String)
'создание потока для чтения из текстового файла
Dim Rf As StreamReader
Rf = New StreamReader(filename)
Try p = Rf.ReadToEnd() 'чтение текста из файла в p
Rf.close() 'закрытие потока
Catch ex As Exception
MsgBox("Невозможно прочитать данные из файла")
End Try
End Sub
Рис. 4.10.3-1
'Процедура построчного чтения данных из текстового файла,
'подсчета числа строк и формирования строки для вывода данных
Sub readfile2(ByVal filename As String, _
ByRef n As Integer, ByRef p As String)
'создание потока для чтения из текстового файл
Dim Rf As New StreamReader(filename)
Dim line As String
p = "" 'строка с исходными данными n = 0 'количество строк в файле
Try Do While Not Rf.EndOfStream() 'пока не достигнут конец потока line = Rf.ReadLine() 'чтение строки из файла в line
n = n + 1
Loop p = p & line & vbNewLine
Rf.Close() 'закрытие потока
Catch ex As Exception
MsgBox("Невозможно прочитать данные из файла")
End Try
End Sub
Рис. 4.10.3-2
В примерах, представленных на рис. 4.10.3-1 и рис. 4.10.3-2, сначала создаются объекты Rf класса StreamReader – потоки открываются для чтения. Далее применяются методы созданных классов: в примере на рис.4.10.3-1 метод ReadToEnd( )считывает всю информацию из файла в строковую переменную p, начиная с текущей позиции (в данном примере с начала файла) и до конца файла; в примере на рис. 4.10.3-2 метод ReadLine( )считывает из потока Rf только одну строку символов и присваивает ее содержимое строковой переменной line. Метод ReadLine( )здесь применяется в цикле, пока не будет достигнут конец потока (endOfStream).
Метод Close( ) закрывает поток Rf и освобождает все ресурсы, которые были связаны с этим объектом.
Класс StreamWriter из библиотеки классов .NET Framework позволяет создавать в программе новые текстовые файлы и записывать в них текстовые данные, а также добавлять текстовые данные в существующие текстовые файлы.
На рис. 4.10.3-3 и рис. 4.10.3-4 представлены процедура записи всей строки в заново созданный текстовый файл и процедура добавления строки в уже существующий файл. Обе процедуры в качестве входных параметров принимают filename(имя файла) и p( строка, содержимое которой записывается в файл).
Тема 4.10.Текстовыефайлы |
Страница 263 |