Visual Basic_учебник (1108585), страница 7
Текст из файла (страница 7)
Первый48после формата преобразуемый параметр имеет индекс 0, следующий –индекс 1 и т.д. Если требуется показать, что фигурная скобка в строкеформата не является частью элемента формата, а должна быть простоперенесена в результат, используют специальное кодирование - вместо одной скобки указывают две. Например:String.Format("Элемент {{0}} заменяется на {0}", Math.E)выдаст в качестве результата:Элемент {0} заменяется на 2,71828182845905.В более сложных случаях элемент формата помимо индекса можетвключать способ выравнивания и спецификацию преобразования.
Способ выравнивания указывается после индекса параметра через запятую и задает минимальное число символов в преобразованном значении. Если число символов оказалось меньше, строка дополняется необходимым количеством символов пробела слева (способ выравнивания положителен) или справа (способ выравнивания отрицателен). Например, программаs=String.Format("| {0,6} | {1,-6} |", -10, 10)Console.WriteLine(s)s=String.Format("| {0,6} | {1,-6} |",3.14,-2.5)Console.WriteLine(s)выдаст такие столбцы:||-10 | 103,14 | -2,5||Как видите, задавать способ выравнивания особенно удобно при печати таблиц.49Спецификация преобразования более точно указывает, как представить преобразуемый параметр в виде строки, и должна следовать заиндексом и способом выравнивания после двоеточия.
Допустимыеспецификации преобразования зависят от типа значения соответствующего преобразуемого параметра. Для типа Double можно указатьлатинскую букву F или латинскую букву E. В первом случае число будетнапечатано в форме с фиксированной десятичной точкой, во втором –в экспоненциальной форме. В обоих случаях за буквой может следовать одна или две цифры, означающие число знаков в дробной части.Если это число не задано, то берется стандартное значение, равное 2для F и 6 для E.
Например, вычисление функцииString.Format("| {0:F} | {0:E} | {0:F4} | {0:E4} |", _Math.PI)даст результат:| 3,14 | 3,141593E+000 | 3,1416 | 3,1416E+000 |Предвосхищая наш очередной пример, заметим, что многократно использованная выше функция Console.WriteLine может вызыватьсяв точности так же, как String.Format.
Отличие лишь в том, чтоConsole.WriteLine не возвращает полученное строковое значение,а дополняет его символами перехода на новую строку и отправляет встандартный выходной поток программы. Для иллюстрации приведенапрограмма печати «читаемой» таблицы тригонометрических функций.50Option Strict OnModule Module1Sub Main()Dim x As DoubleConsole.WriteLine( _"xsin(x)cos(x)")Console.WriteLine( _"---------+-----------+-----------")For i As Integer = 0 To 20x = i * Math.PI / 20Console.WriteLine( _"{0,8:F4}{1,12:F6}{2,12:F6}", _x, Math.Sin(x), Math.Cos(x))NextConsole.ReadLine()End SubEnd Moduleи ее выдачаxsin(x)cos(x)---------+-----------+----------0,00000,0000001,0000000,15710,1564340,9876880,31420,3090170,951057…Пожалуйста, убедитесь в том, что вы не только видите изменившийсярезультат, но и понимаете назначение каждого символа формата, указанного в вызове функции Console.WriteLine.Преобразование Текст → ЧислоДо сих пор мы рассматривали преобразование чисел в текстовые значения.
Задача обратного преобразования решается функциямиDouble.Parse и Integer.Parse. Параметром для каждой из этихфункций должно быть значение типа String, изображающее число.Результатом же будет значение типа Double и Integer, соответственно.51Вот небольшая программа, вычисляющая среднее арифметическое изпяти чисел, заданных в одной строке через точку с запятой.Option Strict OnModule Module1Sub Main()Dim line As String = _"0,26; 348; 8,54; 7,33E-2; 2,55"Dim word As DoubleDim p As IntegerDim sum As Doublesum = 0For i As Integer = 1 To 4p = line.IndexOf(";")word = Double.Parse(line.Substring(0, p))sum = sum + wordline = line.Substring(p + 1)Console.WriteLine("{0,10:E3}", word)Next iword = Double.Parse(line)Console.WriteLine("{0,10:E3}" & vbNewLine & _"среднее значение = {1}",word,(sum+word)/5)Console.ReadLine()End SubEnd ModuleЕще одно замечание о преобразовании чисел в текст и текста в числосвязанно с культурными особенностями правил записи дробных чисел.В России, Германии и некоторых других странах принято отделять целую часть от дробной при помощи запятой.
Но, например, в Англии иСША в тех же целях принято использовать точку. Сам язык VB создан ванглоязычном контексте, поэтому в программе в числовых константахдолжна использоваться десятичная точка. Но работать созданные программы должны в разных культурных контекстах.По умолчанию берется культурный контекст, указанный для пользователя операционной системой. Но исполняющая среда Microsoft .NetFramework позволяет явно установить нужный культурный контекст с52помощью примерно такого оператора присвоения значения переменной:Application.CurrentCulture = _System.Globalization.CultureInfo. _CreateSpecificCulture("en")Не нужно заучивать приведенный текст.
Даже если Вы запомните егоприблизительно, интеллектуальный редактор VB поможет Вам воспроизвести точные обозначения. Здесь параметр "en" устанавливает английский вариант. Если же вместо него задать "ru", то дробная частьбудет отделяться запятой. Помимо чисел, культурный контекст такжевлияет на представление календарных дат. Попробуйте выполнить вразных культурных контекстах следующее предложение и сравнитеполученные результаты.Console.WriteLine( _"Сейчас {1}. Число пи опять равно {0}", _Math.PI, Date.Now)Файлы: считывание исходных данных и записьрезультатовМы уже достаточно много внимания уделили работе с текстом в программах на VB, т.к.
текст – основная форма обмена информацией между исполняющейся программой и внешним миром. Взглянем еще разна рисунок 5 (стр. 14). Здесь у программы один входной поток исходных данных, набираемых с клавиатуры, и один выходной поток, отображающий результаты работы в консольном окне. И в том, и в другомслучае информация передается в виде текста, для работы с этими потокамипредназначеныфункцииConsole.ReadLineиConsole.WriteLine, соответственно.53Аналогичные входные и выходные информационные потоки для считывания и записи данных можно подключить и к файлам на диске.
Дляэтого в программе следует сначала создать объекты, предназначенныедля работы с файлами. Каждый такой объект будет «подключен» кконкретному файлу на магнитном диске. Считывание и запись информации выполняется методами ReadLine и WriteLine.КлассыдляработыстекстовымифайламиназываютсяSystem.IO.StreamReader и System.IO.StreamWriter. Далее мырассмотрим, как ими пользоваться, но вначале упомянем об одной полезной возможности языка VB - префиксах.Исполняющая система содержит много классов с длинными составными именами.
Полная запись таких имен делает программу громоздкойи трудночитаемой, поэтому в VB имеется механизм сокращенной записи составных имен. В начале программы можно добавить несколькопредложений Imports, указывающих возможные префиксы 1 имен.Если в дальнейшем тексте встречается неизвестное имя, VB последовательно перебирает зарегистрированные предложениями Importsпрефиксы и выбирает из них тот, что снимает неопределенность. Например, предложение Imports System.IO позволяет указывать сокращенные имена классов для StreamReader и StreamWriter.
Самипо себе эти имена не определены, но добавив к любому из них префикс System.IO, VB поймет, о чем идет речь.Теперь собственно о рассматриваемых объектах. StreamWriter соответствует выходному потоку программы, записывающему данные вфайл. В отличие от значений встроенных в VB типов Double, Integerили String, каждый объект StreamWriter необходимо создавать припомощи специального выражения конструирования.1приставка, второстепенная часть, присоединяемая к началу слова;54New StreamWriter (<путь_к_файлу>)Выражение конструирования всегда начинается словом New, за которым следует имя класса создаваемого объекта и параметры конструктора. В качестве параметра конструктора StreamWriter указываютстроку, содержащую путь к текстовому файлу в файловой системе, например "D:\Profiles\n0000nn\Documents\results.txt".
Еслифайла по указанному пути не существует, он создается заново. Если жетакой файл уже есть, он обнуляется, прежние данные не сохраняются.Обычно (но не обязательно) созданный объект сразу присваивают переменной типа StreamWriter (переменная out в приведенном нижепримере) и в дальнейшем записывают информацию, последовательновызывая его методы Write и WriteLine (см. таблицу 5). По окончаниизаписи необходимо закрыть файл вызовом метода Close.