Работа с файлами

Работу с записями таблиц, хранящихся в файлах с расширением .dbf, мы рассматривали во второй главе. Для этих целей в Visual FoxPro 9 существует довольно много удобных и эффективных команд. Но для работы с обычнымитекстовыми файлами эти команды совершенно не пригодны. А необходимостьработать с текстовыми файлами возникает весьма часто. Их используют и длявывода текстовых документов (какой-либо отчетности), и для ведения журналов работы программ. Иногда требуется распознавание и ввод данных в таблицы из текстового источника.

Visual FoxPro 9 предоставляет разработчику несколько возможностей дляработы с текстовыми файлами. Во-первых, можно перенаправить стандартный вывод с экрана (куда он направлен по умолчанию) в файл. Во-вторых,можно использовать набор команд для низкоуровневой работы с файлами,аналогичный наборам в других языках программирования высокого уровня.Даже имена большинства этих команд совпадают с именами команд, например, в языке С.

Рассмотрим первый способ, ориентированный только на вывод текстовойинформации.

В Visual FoxPro 9 есть команда ?. Она осуществляет вывод информации, находящейся следом за ней. Например:

По умолчанию вывод осуществляется на экран. Можете ввести указанныевыше команды в окне команд Visual FoxPro 9 (Command) и посмотрите результат вывода в рабочем поле основного окна Visual FoxPro 9. Если будете этопроделывать, обратите внимание, что вторая команда выводит значение переменной ln_MyNum, а значит, этой переменной надо предварительно присвоитькакое-либо значение (например, ln_MyNum = 2005).

Как же направить вывод не на экран, а в файл? Способ достаточно хитрый,но часто используемый. Надо применить последовательно группу следующихкоманд:

После выполнения этих команд все, что выводится командой ?, будет попадать в указанный файл. Если файл не существовал, он будет создан. Если файлсуществовал, он будет перезаписан (все старые данные в файле будут утеряны!).Можно при вводе команды SET PRINTER ТО указать ключевое слово ADDITIVE.В этом случае файл не будет пересоздаваться, а текст в существующий файлбудет дописываться. Только желательно не забыть после всех команд ? использовать группу команд, приведенных ниже.

Чем удобен такой подход? Применять команду ? проще. Как минимум меньше набирать на клавиатуре. И часть операций по открытию, закрытию и позиционированию в файле будет за вас выполнять Visual FoxPro 9.

Когда требуется и записывать в файл, и читать из него, не обойтись без набора команд для низкоуровневой работы с файлами. Рассмотрим основныекоманды.

Перед записью или чтением файла его надо открыть. Для этого используется функция:

>    <Имя_файла> - имя открываемого файла. Можно указывать файл с полным путем к нему;

>    <Атрибут> - позволяет указать, какие действия над содержимым файловвы предполагаете проделывать. Варианты:

-    0 - только чтение (по умолчанию);

-    1 - только запись;

-    2 - чтение и запись.

Если файл успешно открылся, то функция FOPEN () вернет указатель на файл,который нецременно надо сохранить в переменную. Если при открытии файлавозникли ошибки, вернется отрицательное значение. Например:

Если файл требуется создать, имеет смысл воспользоваться командойFCREATE (<Имя_файла> [<Атрибут>] ). После создания файл сразу открываетсяавтоматически. Если файл успешно открылся, то функция FCREATE () вернетуказатель на файл, который надо сохранить в переменную. Если при открытиифайла возникли ошибки, вернется отрицательное значение. Атрибут при использовании функции FCREATE () имеет несколько более широкое значение.Имеются в виду атрибуты файла. Он может принимать следующие значения:

>    0 - чтение и запись (по умолчанию);

>    1 - только чтение;

>    2 - скрытый;

>    3 - только чтение/скрытый;

>    4 - системный;

>    5 - только чтение/системный;

>    6 - системный/скрытый;

>    7 - только чтение/скрытый/системный.

Например:

Будет создан скрытый файл (при соответствующих настройках файловыхменеджеров пользователи не будут видеть этот файл) с именем MyFile.txt.

Файл мы создали. Самое время научиться записывать в него какие-либо данные. Для этого предназначена целая группа функций. Рассмотрим основные.

FPUTS(<Указатель>, <Выражение>[, <Количество_символов>]) -записывает в файл, на который ссылается указатель, символьное выражение. Если указать третий параметр, то запишется не все выражение, а только указанное количество символов. Например:

Р1Ж1ТЕ(<Указатель>, <Выражение> [, <Количество_символов>]) - записывает строку в указанный файл аналогично команде FPUTS (). Разница между этимифункциями заключается в том, что FPUTS() автоматически помещает в конец

записываемой строки символ перевода строки и символ конца строки, аFWRITE() этого не делает.

Разберемся теперь с чтением записанной в файлы информации.

FGETS{<Указатель> [, <Количество_символов>]) - читает из файла, на который ссылается указатель, указанное количество символов (по умолчанию 254).Максимальное возможное количество символов - 8192. Если встретится символ перевода строки или символ конца строки, то вернутся символы с началастроки и до этого места. Функция FGETS () возвращает строковое значение.Например:

Есть и другая функция чтения данных из файла - FREAD ().

FREAD(<Указатель>, <Количество_символов>) - читает из файла, на который ссылается указатель, указанное количество символов. В отличие от функции FGETS (), указание количества символов является обязательным. Максимально возможное количество символов - 65535. Функция FREAD () возвращаетстроковое значение. Например:

Прежде чем прочитать данные, часто требуется переместить курсор в файле на нужное место. Это действие можно осуществить с помощью командыFSEEK.

>    <На_сколко_переместить> - указывается число в байтах, на которое требуется переместить курсор. Если не указывать третий параметр, курсорбудет перемещен относительно начала файла. Допускаются и положительные значения, и отрицательные. При положительных значенияхкурсор будет перемещаться в сторону конца файла, а в случае отрицательных значений - в сторону начала файла;

>    <Относительно_чего> - позволяет задать, относительно какого места вфайле совершать перемещение. Возможные варианты: 0 - начало файла,1 - Текущее положение, 2 - конец файла.

Как определить момент, когда мы достигли конца файла? Для этого естьфункция FEOF (<Указ ате ль>). Она возвращает логическое значение. Если конецфайла достигнут, вернется True (.Т.).

Когда все действия по записи или чтению завершены и больше никакихдействий с файлом не предполагается, надо закрыть файл, используя команду FCLOSE(<Указатель>).

Вы, наверное, заметили, что во всех низкоуровневых командах работы сфайлами мы используем указатель на файл. Это позволяет открывать и работать сразу с несколькими файлами. Однако, если для реализации задачи этогоне требуется, лучше не держать открытыми большое количество файлов.

Попробуем освоить на практике работу с файлами. Допустим, нужно составить программу, которая читает строки из многострочного исходного файла(в котором хранится текст из нескольких строк) и записывает прочитанныестроки без символов перевода строки в другой файл. Получается, что мы переписываем текст, состоящий из нескольких строк, в одну длинную строку. Дляэтого выполните следующие действия:

1.    Смените текущую папку, выполнив в окне Command команду

CD ?

2.    Откроется окно, в котором нужно найти созданную нами ранее папкуexample.

3.    Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопкена панели инструментов Стандартная. Откроется окно,представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.

4.    Ведите следующий ниже текст программы:

5.    Сохраните программу в файле, для чего выберите из меню File (Файл)команду Save (Сохранить) или щелкните по кнопкена панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой ALVTR. Щелкнитемышью в поле Save Document (Сохранить документ) и введите ALVTR.После этого щелкните мышью по кнопке Сохранить (Save).

6.    Прежде чем запускать на выполнение программу, надо заготовить текстовый файл, на котором будем проверять работу программы. Для этогооткройте окно редактора файлов (File (Файл) > New (Новый), в появившемся окне выберите Text file (Текстовый файл) и щелкните мышыо покнопке New file (Новый файл)). В появившемся окне редактора введитенесколько строк, нажимая для перехода на новую строку клавишу Enter.

Закройте это окно мышью и на запрос о сохранении файла ответьте Yes(Да). В появившемся стандартном окне сохранения файла укажите имяmytxt.txt и сохраните его в нашей папке example.

7.    В окне Command введите команду

8.    В результате появится окно с сообщением о том, что обработка закончена. Щелкните по кнопке ОК.

9.    Проверьте, что на диске в папке example появился файл с результатомработы программы myres.txt. Откройте его и посмотрите его содержимое.

10. Откройте файл alvtr.log и посмотрите, в каком виде записался протоколработы нашей программы.

Итоги главы

Подводя итог этой главы, отметим, что мы пользовались процедурным подходом к программированию. Для обучения и знакомства с азами программирования такой подход вполне годится, однако современное программное обеспечение в подавляющем большинстве основывается на объектно-ориентированномподходе к созданию приложений. Мы коснемся вопросов объектно-ориентиро-ванного программирования в четвертой главе.

Правила именования переменных, объявление массивов, конструкции циклов и ветвлений программ - все это справедливо и для объектно-ориентирован-ного программирования. Очень многое из того, что мы изучили в теории и напрактике в третьей главе, пригодится нам для создания полнофункционального приложения.