Visual Basic_учебник (1108585), страница 8
Текст из файла (страница 8)
При этомданные, подготовленные исполняющей системой для записи, но ещенаходящиеся в буфере в оперативной памяти, перемещаются на диск.После вызова метода Close вывод информации при помощи данногообъекта более невозможен.Таблица 5. Методы объектов StreamReader и StreamWriter<StreamReader>.ReadLine () As StringСчитывает одну строку из входного потока, начиная с текущей позиции, и перемещает позицию считывания за ужесчитанную строку. Если входной поток более не содержитинформации, ReadLine возвращает Null.<StreamReader>.ReadToEnd () As StringСчитывает весь текст из входного потока, начиная с текущейпозиции до конца файла.<StreamWriter>.Write (any)Объект Any преобразуется в текстовое представление вызовом Any.ToString(), и результат выводится в выходной поток.55<StreamWriter>.Write (format as String, any …)Указанные формат format и преобразуемые параметры anyформируют строку, как описано для String.Format.
Получившаяся строка выводится в выходной поток.<StreamWriter>.WriteLine (any)Объект Any преобразуется в текстовое представление вызовом Any.ToString(), к нему добавляется последовательностьсимволов перехода на новую строку vbNewLine, и результатвыводится в выходной поток<StreamWriter>.WriteLine (format as String, any …)Указанные формат format и преобразуемые параметры anyформируют строку, как описано для String.Format. К получившейся строке добавляется последовательность символовперехода на новую строку vbNewLine, и результат выводитсяв выходной поток.<StreamWriter>.Close()Выходной поток закрывается, содержимое буферов записывается в файл на диске.Приведенная ниже программа подготавливает текстовый файл с именем sincos.csv.Option Strict OnImports System.IOModule Module1Sub Main()Dim out As StreamWriterDim x As Doubleout = New StreamWriter("sincos.csv")out.WriteLine("x; sin(x); cos(x)")For i As Integer = 0 To 200x = i * Math.PI / 100out.WriteLine("{0}; {1}; {2}", _x, Math.Sin(x), Math.Cos(x))Nextout.Close()End SubEnd Module56Так как полный путь в конструкторе StreamWriter не указан, файлбудет создан в текущей папке.
Обычно это папка, содержащая исполняемый код программы, а именно bin\Debug внутри проекта VB. Послевыполнения программы проверить результаты можно, не выходя изинтегрированной среды разработки VB. В меню File выберите командуOpen File. Диалоговое окно Open File обычно сразу показывает содержимое папки проекта. Перейдите в папку bin, затем в подпапку Debug.Здесь должен быть файл sincos.csv, откройте его. Содержимое файлабудет загружено в окно текстового редактора в центральной части интегрированной среды. При помощи ярлычков в верхней части окнаможно быстро переключаться между просмотром результатов и редактированием текста программы.Файл результатов открыт в текстовом редакторе VB. Если вы не удовлетворены результатом, исправьте текст программы и произведите повторный ее запуск.
В этой ситуации редактор VB самостоятельно обнаружит, что файл результатов обновлен и выдаст диалоговое окно, содержащее имя файла и вопрос: «This file was modified outside of thesource editor. Do you want to reload it?». Ответьте «Yes», и редакторповторно загрузит обновленный файл в прежнее окно. Вероятно, Вамостанется лишь переключиться на файл результатов при помощи ярлычка.Приведенная выше программа формирует такое текстовое представление таблицы чисел, что его легко импортировать на рабочий листMicrosoft Excel. Это можно сделать, например, при помощи того же окна Open File среды VB.
Вместо того, чтобы нажимать кнопку Open,щелкните по файлу правой кнопкой мыши, в появившемся контекстномменю выберите Open With, и затем Microsoft Excel.57Иногда удобнее создавать все файлы результатов в одной папке, например, в папке My Documents. Программируя в Microsoft .Net Framework, полный путь к этой папке получают следующим образом:Dim docFolder As String = _Environment.GetFolderPath( _Environment.SpecialFolder.MyDocuments)Теперь ее удобно использовать в конструктореout = New StreamWriter(docFolder + "\sincos.csv")Объект StreamReader соответствует входному потоку программы,считывающему данные из файла.
Конструктор для него выглядит в точности так же, как и для StreamWriter:New StreamReader(<путь_к_файлу>)Обратите внимание, что если путь в конструкторе StreamReader указывает на несуществующий файл, возникает исключительная ситуация,и программа останавливается.Вы упростите себе задачу по указанию правильного пути, если подготовите текстовый файл с исходными данными прямо в проекте VB. Какэто можно сделать? Откройте проект VB с программой, считывающейданные из текстового файла. В главном меню выберите командуProject|Add New Item… В появившемся диалоговом окне средишаблонов выберите Text File, и в нижней строке задайте имя файлас расширением .txt.
После нажатия на кнопку Add в списке файловпроекта в Solution Explorer появится элемент с указанным Вамиименем. Этот файл можно открывать и редактировать прямо в интегрированной среде VB так же, как и текст программы на Visual Basic.Важный второй этап. В Solution Explorer однократным щелчкомвыберите текстовый файл. В отделе Properties (обычно он прямо58под Solution Explorer) найдите строку, в левой колонке которойстоит Copy to Output Directory. В правой колонке этой строкипоменяйте Do not copy на Copy if newer. Теперь каждый раз призапуске Вашей программы VB будет копировать последнюю версиютекстового файла в папку с исполняемым файлом. Поэтому в конструкторе объекта StreamReader достаточно будет просто указывать имя ирасширение файла, и необязательно – полный путь.Другой способ указать имя файла – воспользоваться объектомSystem.Windows.Forms.OpenFileDialog из системной библиотекиSystem.Windows.Forms.ПрименениеобъектаOpenFileDialog требует подключения к проекту этой библиотеки иобычно увеличивает текст программы на 3-4 предложения.Список библиотек, используемых проектом, доступен в свойствах проекта.
Дважды щелкните ветку My Project в окне SolutionExplorer (см. рисунок 3). В левой части открывшегося окна щелкнитеReferences. Проект Console Application по умолчанию использует библиотеки System, System.Data, System.Deploymentи System.Xml. Щелкните кнопку Add…, и в появившемся диалоговомокне на вкладке .NET выберите в списке System.Windows.Forms. Нажмите OK, библиотека должна быть добавлена в список Referencesпроекта. Можно вернуться к редактированию текста программы, щелкнув ярлычок Module1.vb.Прежде всего, после предложения Option Explicit зарегистрируем префикс System.Windows.Forms.
Это существенно сократитдальнейшие записи:Imports System.Windows.FormsВ подпрограмме Main опишите переменную типа OpenFileDialog идайте ей начальное значение при помощи выражения конструирования:59Dim ofd As OpenFileDialogofd = New OpenFileDialog()Следующий шаг – вызов метода ShowDialog. Его исполнение приводит к появлению стандартного диалогового окна. Метод ShowDialogвозвращает значение, сигнализирующее о том, каким образом былозакрыто диалоговое окно.
Следует проверить, была ли нажата пользователем кнопка OK, сравнением с константой DialogResult.OK. Дляэтого служит предложение If … Else … End If, рассматриваемоев следующих главах. Здесь мы приводим его без комментариев:If (ofd.ShowDialog() = DialogResult.OK) Then...End IfНаконец, между If и End If можно записать основную часть программы, зависящую от информации из файла. Метод FileName дастимя файла для использования в конструкторе StreamReader:If (ofd.ShowDialog() = DialogResult.OK) Thensr = New StreamReader(ofd.FileName)line = sr.ReadLine()...End IfСчитывание информации из текстового файла производят методамиReadToEnd и ReadLine . Оба они возвращают значение типа String.Метод ReadToEnd считывает сразу все символы текста от текущей позиции до конца файла. Так как текущая позиция при этом тоже смещается к концу файла, повторные вызовы ReadToEnd будут возвращатьпустую строку.Метод ReadLine работает несколько иначе.
Он считывает из файлалишь одну строку текста, до символов новой строки. Текущая позицияпри этом перемещается за символы новой строки к началу следующейстроки текста. Если метод ReadLine вернул пустую строку, значит, вфайле встретилась пустая строка, то есть комбинация из двух60vbNewLine подряд. Как же узнать о том, что в файле больше нечегосчитывать?В этой ситуации метод ReadLine вернет специальное значение, обозначаемое именем Nothing. Значение Nothing может относиться клюбому классу объектов и означает отсутствие объекта.
Если переменной присвоено значение Nothing, то нельзя использовать ни одиниз методов объекта – возникнет исключительная ситуация. Действительно, методы предназначены для работы с данными, включеннымив объект. Если же самого объекта нет, то и работать методам не с чем.Если переменной приписан тип String, StreamWriter или другойкласс объектов, то изначально она принимает значение Nothing.Именно поэтому так важно до использования методов, связанных спеременной, не забыть присвоить этой переменной реальный объект.61Глава 6.