Чтение и запись последовательных файлов

Последовательный файл является наиболее общим типом файла. Любой файл, который читается в память целиком, должен быть последовательным. Большинство неформатированных текстовых файлов являются последовательными – так же. Как и большинство файлов программ. В 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

Наши рекомендации