Распечатать страницу

Работа с текстовыми файлами в VFP

« Назад

Вывод данных в текстовый файл может быть организован при помощи вышерассмотренных команд SET TEXTMERGE, SET ALTERNATE и SET PRINTER, употребляемых соответствующим образом с командами \ | \\, TEXT … ENDTEXT и ? | ??. Кроме того, SET PRINTER позволяет направлять данные с последовательный или параллельный порт компьютера.

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

Таблица 4.13

Функции для работы с текстовыми файлами

Функция

Описание

FCHSIZE(nFileHandle,
                nNewFileSize)

Изменяет размер файла, открытого с идентификатором nFileHandle, устанавливая его равным nNewFileSize. Функция вернет либо размер файла в байтах, либо –1, если нет возможности изменить размер файла, например, по причине неверно указанного идентификатора или из-за отсутствия места на диске, или если файл открыт только для чтения

FCLOSE(nFileHandle)

Закрывает файл, открытый с идентификатором nFileHandle, передавая предварительно в него данные из буфера (если вывод осуществляется с буферизацией) и освобождая идентификатор файла.
Функция вернет .T., если файл удалось закрыть, или .F. – в противном случае.
Замечание. Команда CLOSE ALL также закрывает файлы, открытые функциями FCREATE( ) и FOPEN( )

FCREATE(cFileName
                [, nFileAttribute])

Создает и открывает файл cFileName. Если имя файла не содержит пути, то файл создается в директории по умолчанию. Если файл cFileName существует, то функция FCREATE перезапишет его без предупреждения. Необязательный параметр nFileAttribute может принимать следующие значения:
·              0 – (по умолчанию) чтение-запись;
·              1 – только чтение;
·              2 – скрытый;
·              3 – только чтение / скрытый;
·              4 – системный;
·              5 – только чтение / системный;
·              6 – системный / скрытый;
·              7 – только чтение / скрытый / системный.
Функция возвращает идентификатор файла либо –1, если файл не может быть создан.
Замечание. Доступ к файлу проще организовать, если сохранить его идентификатор в системной переменной _TEXT

FEOF(nFileHandle)

Возвращает .T., если позиция файла, открытого с идентификатором nFileHandle, находится в конце файла, или .F. – в противном случае

FERROR( )

Возвращает номер последней ошибки, возникшей при выполнении функции работы с текстовыми файлами. FERROR( ) вернет 0, если функции обработки текстовых файлов выполняются успешно. Возможны следующие ошибки:
·              2 – файл не найден;
·              4 – открыто слишком много файлов;
·              5 – отказано в доступе;
·              6 – неверный идентификатор файла;
·              8 – выход за границы памяти;
·              25 – ошибка при выполнении FSEEK;
·              29 – нет места на диске;
·              31 – ошибка при открытии файла

FFLUSH(nFileHandle
               
[, lForce]))

Пересылает данные из буфера в файл, открытый с идентификатором nFileHandle, освобождая при этом память, отданную для буферизации. Тип возвращаемого результата – логический.
Если параметр lForce задан и равен .T., то данные на диск передаются немедленно, если параметр опущен и равен .F. (по умолчанию), то данные передаются на диск при первой возможности.
Замечание. Употребление функции имеет смысл при записи в файл с буферизацией

FGETS(nFileHandle
                [, nBytes])

Возвращает, если задан параметр nBytes, из файла, открытого с идентификатором nFileHandle, nBytes байт при условии, что в процессе чтения не встречен символ возврата каретки. Если символ обнаружен, то функция возвращает байты, расположенные начиная от текущей позицией файла до найденного символа возврата каретки. Если параметр nBytes опущен, функция читает символы, расположенные начиная от текущей позицией файла до очередного символа возврата каретки, но не более 254 байт.
Если символ возврата каретки обнаружен, то после чтения позиция файла устанавливается вслед за этим символом, который, кстати, не возвращается как частью прочитанной строки. Символы новой строки также при чтении игнорируются

FOPEN(cFileName
                [, nFileAttribute])

Открывает файл cFileName. Если путь в имени файла отсутствует, то VFP ищет файл в директории по умолчании или заданной командой SET PATH. Необязательный параметр nFileAttribute может принимать следующие значения:
·              0 – (по умолчанию) только чтение, с буферизацией;
·              1 – только запись, с буферизацией;
·              2 – чтение-запись, с буферизацией;
·              10 – только чтение, без буферизации;
·              11 – только запись, без буферизации;
·              12 – чтение-запись, без буферизации.
Функция возвращает идентификатор файла либо –1, если файл не может быть создан.
Замечание. Информацию об открытом или созданном файле можно просмотреть или направить на принтер при помощи команды DISPLAY | LIST STATUS

FPUTS(nFileHandle,
                cExpression
                [, nCharWritten])

Выполняет и возвращает то же, что и FWRITE( ), проставляя в конце строки символы возврата каретки и новой строки

FREAD(nFileHandle,
                nBytes)

Возвращает из файла, открытого с идентификатором nFileHandle, nBytes байт. Число прочитанных символов будет меньше, если при чтении обнаружен конец файла

FSEEK(nFileHandle,
                nBytesMoved
                [, nRelativePos]))

Перемещает позицию файла, открытого с идентификатором nFileHandle, на nBytesMoved байт от начала файла, если параметр nRelativePos не задан или равен 1, либо от позиции, устанавливаемой nRelativePos. Позиция перемещается по направлению к концу файла, если nBytesMoved > 0, или к началу файла – в противном случае.
Параметр nRelativePos может принимать следующие значения:
·              0 – (по умолчанию) сдвиг позиции от начала файла;
·              1 – сдвиг от текущей позиции файла;
·              2 – сдвиг от конца файла.
Функция после перемещения возвращает позицию файла (в байтах), отсчитываемую от начала файла.
Замечание. При вызове FSEEK(h, 0, 2) функция вернет размер файла, открытого с идентификатором h

FWRITE(nFileHandle,
                cExpression
                [, nCharWritten])

Записывает в файл, открытый с идентификатором nFileHandle, строку cExpression или nCharWritten ее символов, если этот параметр задан и его величина меньше длины строки cExpression. Функция в отличие от FPUTS( ) не размещает в конце строки символы возврата каретки и новой строки. Функция возвращает число переданных байтов, либо 0 если запись выполнить не удалось.
Замечание. Каждый ANSI-символ занимает 1 байт памяти

Замечание. Файлы, создаваемые FCREATE( ), называются в VFP файлами низкого уровня.

Пример. В текстовом файле d:\Authors.txt находится следующий список авторов:

Список авторов

23

Арабов Юрий Николаевич

21.11.2004 0:00:00

12

Булгаков Михаил Афанасьевич

01.01.0001 0:00:00

9

Варламов Алексей Николаевич

01.01.0001 0:00:00

17

Галактионова Вера Григорьевна

21.11.2004 0:00:00

18

Головин Геннадий Николаевич

21.11.2004 0:00:00

14

Дегтев Вячеслав Иванович

21.11.2004 0:00:00

19

Крупин Владимир Николаевич

21.11.2004 0:00:00

4

Лимонов Эдуард Вениаминович

15.09.2004 0:00:00

1

Личутин Владимир Владимирович

21.11.2004 0:00:00

30

Распутин Валентин Григорьевич

01.01.0001 0:00:00

20

Сегень Александр Юрьевич

21.11.2004 0:00:00

22

Сычева Лидия Андреевна

21.11.2004 0:00:00

5

Тельников Константин Павлович

01.01.0001 0:00:00

16

Тюрин Юрий Петрович

21.11.2004 0:00:00

В качестве разделителя между полями файла использован символ табуляции.

Из файла d:\Authors.txt в таблицу d:\Authors2.dbf добавляются сведения об авторах, в этой таблице отсутствующие. Запись добавляется в том случае, если:

1) в строке файла имеются три поля с данными;

2) задана дата ввода данных об авторе (дата, указанная в третьем поле файла, больше даты 01/01/0001);

3) в таблице Authors нет записи с кодом, указанным в первом поле текстового файла (вводятся только свежие данные).

Соответствие между полями текстового файла и таблицы Authors2.dbf следующее:

  • поле 1 файла соответствует полю AuthorId типа Integer;

  • поле 2 – полю Author типа Character;

  • поле 3 – полю InputDate типа Date.

В приводимой программе таблица d:\Authors2.dbf, если она отсутствует, получается как копия таблицы Authors базы данных HomeLibrary.dbc.

#define TAB Chr(9)            && Chr(9) – код символа табуляции

h = Fopen('d:\Authors.txt')

&& Следующий оператор позволит при отладке закрывать файл d:\Authors.txt,

&& выполняя в командном окне Fclose(_TEXT)

_TEXT = h

if h > 0

&& Устанавливаем соответствующий формат даты

set date to German

close databases

open database 'd:\HomeLibrary\HomeLibrary'

&&

use Authors

if not File('d:\Authors2.dbf') then

copy structure extended to d:\AuStucture

create d:\Authors2 from d:\AuStucture

else

use d:\Authors2

endif

index on AuthorId to d:\AuthorId2

&& Число записей до добавления

nRecBefore = Reccount( )

&& Пропускаем заголовок

Fgets(h)

do while not Feof(h)

textLine = Fgets(h)

&& Создаем массив aAuthor из слов строки;

&& в качестве разделителя берем символ табуляции

Alines(aAuthor, textLine, TAB)

&& Пропускаем строку textLine, если число элементов в массиве не равно 3-м

if Alen(aAuthor) != 3 then

loop

&& Преобразовываем строку с датой и временем

&& первоначально в дату и время, а затем в дату

aAuthor(3) = Ttod(Ctot(aAuthor(3)))

&& Проверяем дату для поля InputDate

if aAuthor(3) > {^0001–01–01}

&& Проверяем, если запись с кодом aAuthorId(1) в таблице Authors.dbf

&& Если нет, то добавляем новую запись в таблицу

if not Seek(Val(aAuthor(1))) then

&& Контрольный вывод данных в окно VFP

? aAuthor(1) picture '999', aAuthor(2), aAuthor(3) at 90

insert into Authors2 from array aAuthor

endif

endif

enddo

&& Закрываем файл 'd:\Authors.txt'

Fclose(h)

wait "Добавлено записей: " + Transform(Reccount( ) – nRecBefore) window

&& Просмотр таблицы Authors.dbf

browse last nowait

else

MessageBox("Не могу открыть файл со списком авторов!")

endif

Если структура всех строк исходного файла одинакова, то данные в текущую таблицу можно добавить из файла, употребив команду APPEND FROM. В нашем примере файл будет пригоден для обработки этой командой, если удалить из него заголовок и в третьем поле взамен даты и времени оставить только дату. Кроме того, в файле не должно быть записей, нарушающих уникальность ключа AuthorId.

Таким образом, если каждая строка файла имеет следующую структуру:

23Арабов Юрий Николаевич        21.11.2004

то программа, выполняющая добавление, может быть такой:

set date to German

close databases

use d:\Authors2

if File('d:\Authors2.txt')

&& Authors2.txt – файл со списком авторов, не содержащий заголовка

&& и имеющей вместо даты и времени только дату

append from d:\Authors2.txt;

fields AuthorId, Author, InputDate;

for InputDate > {^0001–01–01};

delimited with tab

wait "Добавлено записе: " + Transform(_TALLY) window

brow last nowait

else

MessageBox("Текстовый файл со списком авторов не найден!")

endif