Невидимый символ возврата каретки
Вы, наверное, удивитесь, если я скажу, что на самом деле в текстовом файле никаких строк нет. Вся информация в текстовом файле представляет собой одну непрерывную цепочку символов. А как же тогда работают методы ReadLine и WriteLine, которые имеют дело со строками файла? – спросите вы. Давайте разберемся.
Вернемся к 19.2.2Вот как на самом деле будет выглядеть информация в файле после выполнения четырех операторов Запись.WriteLine:
Азия¶5,27¶29.03.2005 21:30:00¶12¶
Каждое выполнение метода WriteLine записывает в файл не только положенную информацию, но последним символом в конец ее дописывает некий невидимый для нас управляющий символ, который я условно обозначил ¶. Называется он «Перевод строки и возврат каретки» и название свое берет от тех древних времен, когда не было еще никаких мониторов и компьютер печатал информацию на автоматических пишущих машинках. Часто для краткости этот символ зовут просто «Возврат каретки» или «Перевод строки». В некотором смысле он является не одним, а парой символов: «Перевод строки» и «Возврат каретки», но мы не будем вдаваться в эти подробности. Для нас это – один символ.
Каждое выполнение метода ReadLine считывает информацию из файла до следующего символа возврата каретки, но сам этот символ не считывается. Таким образом, путаницы с методами ReadLine и WriteLine не получается и все идет нормально.
Метод Write, в отличие от метода WriteLine, символ возврата каретки не дописывает.
ReadToEnd. У класса StreamReader имеется удобный метод ReadToEnd, который считывает в единую строку все содержимое файла от текущего положения считывающей головки до конца файла. Символы возврата каретки считываются тоже и входят на своих местах в состав этой строки. Посмотрим, как ведет себя эта странная строка, включающая невидимые символы.
Разместите на форме текстовое поле. Сделайте его многострочным (см. 3.4.2). При условии, что в файле Filimon.txt содержится описанная выше информация, запустите следующую учебную процедуру:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Чтение As New System.IO.StreamReader("E:\VB\Filimon.txt")
Dim Строка, s As String
Строка = Чтение.ReadLine
s = Чтение.ReadToEnd
Чтение.Close()
TextBox1.Text = s
Debug.WriteLine(s)
End Sub
Пояснения: Переменная Строка получает после выполнения оператора
Строка = Чтение.ReadLine
значение "Азия”.
Переменная s имеет строковый тип и поэтому получает после выполнения оператора
s = Чтение.ReadToEnd
строковое значение оставшейся части файла:
5,27¶29.03.2005 21:30:00¶12¶
Как видите, в состав этой строки входят 3 символа возврата каретки.
Следующие два оператора
TextBox1.Text = s
Debug.WriteLine(s)
выводят эту строку в текстовое поле и в окно Output.
Вот как будет выглядеть окно Output:
5,27
29.03.2005 21:30:00
12
Точно так же будет выглядеть и текстовое поле.
Впечатление такое, как будто выводилась не одна строка, а три. Но выводилась все-таки одна строка. Просто компьютерный механизм вывода текстовой информации в текстовое поле, в окно Output и другие объекты таков, что
если в выводимой текстовой информации встречается символ возврата каретки, то вывод оставшейся части этой информации продолжается с новой строки.
А нам кажется, что строк было три.
Мы показали, что символ возврата каретки – это управляющий символ.
Вы можете при желании принудительно вставлять символы возврата каретки в текстовую строку. Ну, прежде всего, вы непроизвольно делаете это каждый раз, когда при вводе текста в текстовое поле нажимаете клавишу Enter. В этом случае вы вставляете символ возврата каретки в текстовую строку, являющуюся свойством Text текстового поля.
Символ возврата каретки является также значением константы vbNewLine из модуля Constants, входящего в пространство имен Microsoft.VisualBasic. Вы можете написать так:
Dim s1 As String = "Азия" & vbNewLine & "Европа"
TextBox1.Text = s1
Dim s2 As String = "Пас" & vbNewLine & "Гол" & vbNewLine
& "Дисквалификация"
Label1.Text = s2
Результат выполнения этого фрагмента вы видите на Рис. 19.1.
Рис. 19.1
Обратите внимание, что нам было бы трудно другими средствами заставить данный конкретный текст метки выводится так, как на рисунке – по одному слову в строке.
Значение константы vbNewLine является комбинацией пары символов с номерами 13 и 10 в таблице ASCII. Поэтому можно было написать и так:
TextBox1.Text = "Азия" & Chr(13) & Chr(10) & "Европа"