Чтение из знакомого текстового файла
Задача 2: Пусть известно, что первыми тремя строками в текстовом файле с именем Filimon.txt являются слово, число и дата. Требуется прочесть их оттуда в оперативную память компьютера. Вот программа:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Создаем объект для чтения информации из текстового файла E:\VB\Filimon.txt:
Dim Чтение As New System.IO.StreamReader("E:\VB\Filimon.txt")
'Подготавливаем 3 переменные для хранения информации из текстового файла E:\VB\Filimon.txt:
Dim Строка As String
Dim Число As Double
Dim Дата As DateTime
'Считываем 3 строки из файла (4-ю считывать не стали):
Строка = Чтение.ReadLine
Число = Чтение.ReadLine
Дата = Чтение.ReadLine
Чтение.Close() 'Закрываем файл
'Демонстрируем, что со считанной информацией можно по-всякому работать:
Debug.WriteLine(Строка & "!")
Debug.WriteLine(Число - 1)
Debug.WriteLine(Дата.TimeOfDay)
End Sub
Пояснения: Для чтения из текстового файла будем применять объект класса StreamReader. Его мы создаем первым оператором нашей процедуры. Говорят, что при выполнении этого оператора файл открывается для чтения. При этом компьютер выполняет определенные подготовительные действия для работы с файлом. Так, магнитная головка перемещается в начало файла. Ничего, конечно, не стирается.
Затем мы должны подготовить в оперативной памяти компьютера место для принимаемой информации, что мы и делаем, объявляя 3 переменные. Имейте в виду, что в самом файле нигде не говорится, к какому типу данных относится та или иная информация в нем и даже сколько ее там. То есть совершенно невозможно узнать, что такое, например, 5,27 из предыдущей задачи. То ли это одно дробное число – пять целых двадцать семь сотых, то ли это два целых числа через запятую, то ли это пять целых две десятых и рядом стоящая семерка, то ли это просто строка из 4 символов. Поэтому нет смысла читать информацию из файла, если нам заранее не рассказали, какой тип имеют данные в файле.
Следующие 3 оператора процедуры считывают из файла 3 строки и присваивают их значения соответствующим переменным. Чтение осуществляется методом ReadLine объекта Запись. Этот метод просто считывает целиком очередную строку файла, что бы в ней ни было записано.
После завершения чтения из файла его нужно закрыть методом Close.
Вот что распечатает эта процедура, если файл был заполнен, как в предыдущей задаче:
Азия!
4,27
21:30:00
Преобразования типов при чтении из текстового файла. При чтении из текстового файла метод ReadLine рассматривает каждую строку файла как цепочку символов, то есть просто как обыкновенную строку (тип String), а при присваивании данной строки переменной величине VB пытается преобразовать ее к типу этой переменной. Так, при выполнении оператора
Дата = Чтение.ReadLine
VB пытается преобразовать строку
29.03.2005 21:30:00
к типу DateTime. Поскольку эта строка файла представляет правильную запись даты, присваивание проходит успешно.
Если бы мы вместо
Dim Число As Double
написали бы
Dim Число As Integer
VB попытался бы преобразовать строку 5,27 в целое число, у него бы это получилось и мы бы увидели такую распечатку:
Азия!
4
21:30:00
В случае неудачи преобразования VB выдает ошибку.
Считывается информация из текстового файла строго по порядку, сверху вниз. Мы не можем прочитать что-то сперва в начале файла, потом в конце, потом в середине. Поэтому к катастрофе приведет ситуация, когда в процедуре мы вот так перепутаем местами операторы:
Дата = Чтение.ReadLine
Число = Чтение.ReadLine
Верхний из них попытается преобразовать 5,27 к типу DateTime и потерпит неудачу. VB выдаст ошибку.
Лишняя работа. Из-за последовательного характера записи и чтения при работе с текстовым файлом, компьютеру приходится выполнять лишнюю работу. Так, если нас в текстовом файле интересует, скажем, только 3-я строка, нам, чтобы до нее добраться, все равно придется прочесть и 1-ю и 2-ю строки. Если мы в текстовом файле из большого количества строк хотим исправить только одну, нам придется вновь записать все строки файла, так как перед записью вся информация из файла стирается.