Чтение и запись последовательных файлов
Последовательный файл является наиболее общим типом файла. Любой файл, который читается в память целиком, должен быть последовательным. Большинство неформатированных текстовых файлов являются последовательными – так же. Как и большинство файлов программ. В Visual Basic текстовые файлы также представляют собой файлы последовательного доступа. Данные в этих файлах записаны также в форме строк символов ANSI.
Открытие файла
Прежде чем Visual Basic сможет что-либо сделать с дисковым файлом, необходимо открыть этот файл и подключить к нему файловое число. Файловые числа – это небольшие целые числа. Которые связываются с файлом при его открытии. Команды чтения и записи используют файловые числа для указания файла, в который надо писать или из которого надо читать.
Для открытия последовательного файла используется оператор Open, имеющий следующий синтаксис:
Open имя_файла For режим As файловое_число
Аргумент имя_файла является строкой, содержащей имя и путь файла, который необходимо открыть. Если файл находиться в текущей директории, то достаточно указать только его имя. Если файл находиться не в текущей директории, то для него необходимо указывать полный путь.
Аргумент режим определяет тип файла, который необходимо открыть, и способ открытия файла. Режим должен принимать одно из литеральных значений: Input, Output, Append (для последовательных файлов) или Random (для файлов произвольного доступа). Кроме того, в особых ситуациях может применяться режим двоичного доступа. Режим Input открывает файл для чтения, а режим Output – для записи. Оба режима открывают файл последовательного доступа с его начала. Режим Append открывает файл с конца – с тем, чтобы при записи новых данных не пришлось переписывать все записи от начала файла. Попытки открыть несуществующий файл с режимом Input приведут к ошибке; если открыть несуществующий файл с режимами Output и Append, то файл будет создан.
Аргумент файловое_число определяет число, которое присваивается файлу. Обычно первому файлу присваивают 1, второму – 2 и т.д. если файл закрывается, то освободившееся файловое число может быть использовано повторно; нельзя открыть файл, используя файловое число, которое уже присвоено открытому файлу.
Если неизвестно, какое файловое число является допустимым в данный момент, то для присвоения некоторой переменной допустимого файлового числа можно воспользоваться функцией FreeFile. Затем эта переменная используется в качестве оператора Open, а также операторов чтения и записи файла. Так, следующие строки кода открывают последовательный файл для чтения:
FileNum1 = FreeFile
Open “myfile.txt” For Input As FileNum1
В данном примере функция FreeFile использована для выбора следующего допустимого файлового числа, а затем файл с именем MYFILE.TXT открывается с начала для чтения.
Закрытие файла
После завершения работы с файлом, его необходимо закрыть с помощью оператора Close. В качестве аргумента оператора Close используется файловое число, указывающее на то, какой файл нужно закрыть.
Ниже приведен синтаксис оператора Close:
Close #файловое_число
Если опустить аргумент файловое_число, то Visual Basic закроет все открытые файлы.
Печать в файл
Если файл открыт, то для записи в него данных можно использовать оператор Print. Данные, записываемые оператором Print, представляют собой текст, подобный тому, который выдается на принтер.
Если печатается некоторый текст, то этот текст записывается в файл. Если печатается число, то это число помещается в файл. Если печатается переменная, то в файл помещается значение этой переменной.
Если поместить в строку для печати несколько элементов, разделенных запятыми, то они будут напечатаны в блоках, заполненных пробелами и разделенных фиксированными табулостопами через каждые 14 символов:
Print 1, 2, 3, 4
1 2 3 4
Print “Один”, “Два”, “Три”, “Четыре”
Один Два Три Четыре
Однако если вместо запятых использовать символ (;), то напечатанные элементы не будут содержать пробелов:
Print 1; 2; 3; 4
1 2 3 4
Print “Один”; “Два”; “Три”; “Четыре”
ОдинДваТриЧетыре
Примечание:
Если разделить символом (;) числа в операторе Print, то напечатанная строка будет содержать по два пробела между числами. Эти пробелы появляются в результате того, что оператор Print преобразовывает каждое число в строку текста, добавляя к нему ведущий и конечный пробелы, что в результате и дает два пробела между числами.
Для управления печатью следует использовать функцию Format (). Функция Format () получает два аргумента, а возвращает отформатированную строку. Первым аргументом является переменная, содержащая число, которое нужно напечатать, а второй аргумент содержит строку форматирования, определяющую форму, в которой нужно напечатать число. строка форматирования подобна тому, что используется в Excel для форматирования содержимого ячеек.
Символ | Значение символа |
(#) | Используется в качестве цифровых заполнителей |
(,) | Указывает на то, что каждые три символа отделяются запятой |
(.) | Указывает положение десятичной точки |
(0) | Указывает позицию обязательного символа |
Для печати в дисковый файл после зарезервированного слова Print необходимо записать символ (#), файловое число и запятую:
Print #файловое число, список_аргументов
где файловое_число определяет открытый файл, а список_аргументов содержит то, что необходимо напечатать.
Пример 1 “Работа оператора Print”
Open “c:\Мои документы\Myfile_1.txt” For Output As 1
Print #1, “Общий привет”
Print #1, 5
a = 5
Print #1, a
Print #1, 1, 2, 3, 4
Print #1, 1; 2; 3; 4
Print #1, “Один”, “Два”, “Три”, “Четыре”
Print #1, “Один”; “Два”; “Три”; “Четыре”
Print #1, a
Print #1, a, Format(a, “#,###.00”), Format(a, “#.0”)
a = 0.1234
Print #1, a, Format(a, “#,###.00”), Format(a, “0.00”), Format(a, “00.00”)
a = 1234.
Print #1, a, Format(a, “#,###.00”), Format(a, “0.00”), Format(a, “00.0”)
Close #1
Запись в файл
При использовании оператора Print данные, записываемые в дисковый файл, формируются в пригодную для чтения форму, подобную текстовому документу. Однако если предполагается чтение этих данных программами на Visual Basic, то их следует записывать не оператором Print, а оператором Write. Оператор Write работает подобно оператору Print, но сохраняет существовавшие кавычки и разделяет выводимые данные запятыми. Эти запятые и кавычки упрощают в Visual Basic определение конца одного элемента данных и начала другого.
Пример 2 “Работа оператора Write”
FNum = FreeFile
Open “c:\Мои документы\Myfile_2.txt” For Output As FNum
Write #FNum, “Общий привет”
Write #FNum, 5
a = 5
Write #FNum, a
Write #FNum, 1, 2, 3, 4
Write #FNum, 1; 2; 3; 4
Write #FNum, “Один”, “Два”, “Три”, “Четыре”
Write #FNum, “Один”; “Два”; “Три”; “Четыре”
Write #FNum, a
Write #FNum, a, Format(a, “#,###.00”), Format(a, “#.0”)
a = 0.1234
Write #FNum, a, Format(a, “#,###.00”), Format(a, “0.00”), Format(a, “00.00”)
a = 1234.
Write #FNum, a, Format(a, “#,###.00”), Format(a, “0.00”), Format(a, “00.00”)
Close #FNum
Можно увидеть различия в результатах работы операторов Write (рис. 1.2) и Print (рис.1.1). Оператор Write отделяет каждый элемент данных запятой и заключает каждую строковую величину в кавычки. Строки, возвращенные функцией Format (), также заключаются в кавычки. Использование кавычек и запятых для разделения отдельных элементов данных значительно упрощает применение оператора Input. Без них было бы практически невозможно определить, где кончается один записанный элемент и начинается следующий.
Чтение из файла
Для чтения данных из файла применяются операторы Input и Line Input. Первый аргумент каждого из этих операторов является символ (#) и файловое число, затем следует запятая, отделяющая указатель файла, подлежащего чтению. Далее следуют аргументы – имена переменных, которым присваиваются прочитанные из файла значения.
В операторе Input переменные, следующие после запятой, определяют порядок и количество данных, которые будут прочитаны из файла. Пробелы и табуляторы, расположенные в начале строки, игнорируются. Если переменная должна принимать числовые значения, то Visual Basic пытается прочесть из файла число. Первый непустой символ рассматривается как начало числа, и Visual Basic продолжает чтение числа. Если переменная является строковой, то Visual Basic читает эту строку, начиная с первого непустого символа, и прекращает чтение, если встречает запятую или конец строки. Если первый непустой символ является символом (“), то первым символом, прочитанным в строку, будет первый символ после символа (“) и чтение будет продолжено до тех пор, пока не встретиться второй символ (“) или конец строки, т.е. будут прочитаны все символы, заключенные в кавычки, включая запятые.
Операторы Write и Input спроектированы для совместной работы в целях записи данных в файл и последующего их чтения.
Оператор Line Input является дополнением оператора Input. Оператор Line Input присваивает единичному строковому аргументу все символы, обнаруженные в единичной строке файла. Строковому аргументу – переменной присваиваются все символы, включая начальные пробелы, запятые и кавычки. Оператор Line Input применяется для чтения в программу точной копии содержимого строки файла. Единичными символами, не пересылаемыми оператором Line Input, являются символы возврата каретки и перевода строки, рассматриваемые как конец строки.
Текст макроса:
Sub Макрос_3()
Open "c:\Мои документы\Myfile.txt" For Input As 100
Open "c:\Мои документы\Myfile_3.txt" For Output As 101
'Чтение первой строки файла в три отдельные переменные.
'Первая строковая переменная получает текст, расположенный от начала строки до первой запятой,
'вторая - текст, расположенный между первой и второй запятыми,
'третья - текст, расположенный после второй запятой и до конца строки.
Input #100, b$, c$, D$
Print #101, b$
Print #101, c$
Print #101, D$
'Чтение второй строки файла
'Так как эта строка заключена в кавычки, то ее можно прочитать одним оператором Input в одну строковую переменную
Input #100, b$
Print #101, b$
'Чтение третьей строки файла
'В данном случае сроковая переменная получит данные, заключенные в кавычки (но без символа("))
'а числовая переменная - число. Если опять прочесть из файла строковую переменную, то она получит оставшуюся часть строки
Input #100, b$, a
Print #101, b$
Print #101, a
Input #100, b$
Print #101, b$
'Чтение четвертой строки файла
'Вся строка, включая запятые и кавычки, передается в строковую переменную
Line Input #100, b$
Print #101, b$
'Чтение пятой строки файла
'Чтение чисел в три числовые переменные(пробелы между числами воспринимаются как разделители)
Input #100, e, f, g
Print #101, e
Print #101, f
Print #101, g
'Чтение шестой строки файла
'Чтение чисел в две числовые переменные(пробелы между числами игнорируются)
Input #100, e, f
Print #101, e
Print #101, f
'Чтение седьмой строки файла
'Данную строку можно прочитать с единичной строковой переменной в качестве аргумента оператора Input.
'Начальные пробелы будут проигнорированы, переменная получит текст, начиная с первого непустого символа и до первой запятой.
'Здесь гораздо удобнее применять оператор Line Input: он позволит прочесть все от начала строки до ее конца.
Input #100, b$
Print #101, b$
Line Input #100, b$
Print #101, b$
'Чтение восьмой строки файла
'Чтение строки оператором Line Input. В результате - строка, включая пустые пробелы в начале.
Line Input #100, b$
Print #101, b$
Close #100
Close #101
End Sub